Benim bir meslektaşım bugün temelde böyle gitti bizim kodunda çok ince hata, ortaya:Dize niçin `operator = (char)` işlevini destekliyor?
double d = 65;
std::string s = "Hello world";
// .. somewhere later, accidentally assigning to s instead of a similarly
// named numerical variable.
s = d;
// s is now 'A'
bu hata buldum, std::basic_string<_Elem>
bir atama operatörü olmasıdır oluşabilir nedenini
_Myt& operator=(_Elem _Ch)
{ // assign 1 * _Ch
return (assign(1, _Ch));
}
Şimdi derleyici gerçekten şikayet etmiyor. Görünüşe göre bu hatayı yeterince erken yakaladık ki çok fazla hasar vermedi, ama neden buna izin verildiğini merak ediyordum.
std::string
bir
char
alan bir (n örtülü) yapıcısı olmadığı için de olsa ben
std::string s = 65;
yazamazsınız. Eğer
std::string s = string('A');
yazmaya ve bu tek _Elem
(char
) için atama yasaklamak olurdu o bunu zorlar açık bir dönüşüm yapmak için daha güvenli olmaz.
bu atama operatörü sağlandı bir nedeni var mı? Aynı meslektaşı doğru fark olarak,
double d;
char c = d;
int* p = d;
ise bırakılır olmayan (herhangi bir ibre boyutu için) olan - muhtemelen işaretçi dizi kapalı dönüştürme tehlikeli kabul edilir, çünkü. Aslında, gördüğüm kadarıyla, veri tipi yönetiminde oldukça katı ve yardımcı olmaya çalışan C++ 11'e dönüşmüş gibi görünüyor.
Bu yüzden uyarıları daima yüksek tutuyorsunuz! "bir çift ve bir char dört bayt sığar" bu ne anlama geldiğinden emin değil. Onlar farklı boyutlarda. –
@NeilKirk Varsayılan olarak, kurulu öntanımlı uyarı düzeyi neden yüksek değil? Kimse, derleyicilerinin, müşterilerinin kodlarını, tüm kötü uygulamaları hakkında bir uyarı denizine gömen ilk kişi olmasını istemiyor mu? –
"bunu C++ 11'e dönüştürmüş gibi görünüyor" - çünkü onu kaldırmak eskiyen kodun kırılmasına neden olabilir, bu yüzden hafif bir şey yapamazsınız. –