Son bir projede, yanlışlıkla bir dize başvurusuna bir kayan nokta atadığım bir hatayla karşılaştım (floatın bir dizeye dönüştürülmesi yerine, atama). dize açıkça çöp sonuçlanır YazdırmaBir dize referans çalışması için bir float atama - neden?
#include <iostream>
using namespace std;
static void get_text(string &s) {
s = 1.0f; // Legal (not even a warning!)
}
// This version gives a compiler error (as I'd expect)
// static void get_text(string &s) {
// string out = 1.0f;
// s = out;
// }
int main() {
string s;
get_text(s);
cout << s << endl; // Prints garbage
return 0;
}
, ama neden bu yapmadım net değilim:
kodu (her ikisi Xcode/Apple LLVM 7.1 ve GCC 4.9.2 altında test) böyle bir şey görünüyordu Uyarı olarak çok ver. (En iyi tahminim, derleyicinin float'tan int'ye, bir bellek adresine gitmesi için bir tür örtülü yeniden yorumlama yapmasıydı ...?)
Etkinleştirebileceğim bir uyarı var mı (Xcode'da, ideal olarak) Gelecekte bu tür şeyleri engeller mi?
Büyüleyici. Posterity uğruna, 'std :: string' içinde bir 'operator = (char c)' varken bunu ekleyeceğim, tek bir karakteri alan bir müteahhit değil --- 'get_text()' in ikinci sürümü soruda derlenmez. Okumak için ikinci sürümü değiştirirsem: 'string out; out = (char) 1.0f; ', derleme yapar. – s3cur3