2016-03-27 19 views
2

Aşağıdaki kod sadece xxx satırının basılı olduğu (yani "pre concat" dan önce) bir segmentasyon hatası üretir.C++ Operator + string uzunluğunda Segmentasyon Hatası

cerr << "xxx + " << ((long long) timev); 
string cname = "MyKey" + ((long long) timev); 

string operator+(const string& str, long long nr) { 
    cerr << "Pre concat "; // << str << "$" << nr; 
    stringstream ss; 
    ss << str << nr; 
    cerr << "Post concat"; 
    return ss.str(); 
} 

Neden olursa olsun?

(Ben bu sorunun ne görebilirsiniz eğer ben sadece diğer modüllerle çatışma olasılığı olduğu gibi muhtemelen kötü bir fikir standart türlerinde operatörleri aşırı yükleme, bir yöntem kullanırlar. Ama lanet edecektir.)

+0

'timev' beyanı nedir? – Maikel

+0

std :: cout << "MyKey" + 2; 'çıkışlarına bakın. '' 'Yerine önceki satırda' + 'kullandıysanız bir sorunla karşılaşırdınız. – molbdnilo

+0

Bir hata ayıklayıcı kullanmayı öğrenin. –

cevap

6

"MyKey"std::string değil. const char[6]. Ve "MyKey" + ((long long) timev) için, aşırı yükleme operatörünüz çağrılmayacak. Bunun yerine, "MyKey"const char* için bozulur, daha sonra "MyKey" + ((long long) timev) dizinin sınırından çıkabilir, UB.

kodu olarak eşdeğerdir:

const char* key = "MyKey"; 
string cname = key + ((long long) timev); // or key[((long long) timev)] 

Yapabilirsin

string cname = string("MyKey") + ((long long) timev); 
+1

@juanchopanza OP tanımlı bir tane. Kabul edilebilir değil mi? – songyuanyao

+0

Oh, anlıyorum. Hayır, buna izin verildiğini düşünmüyorum. – juanchopanza

+0

@juanchopanza Yani ilk soruma geri dönün. Standart lib tipleri için aşırı yüklenmeye izin verilmiyor mu? (Bu konuda, kullanıcı türü için izin verilen stl şablonu belirtimi gibi bazı sorunları biliyorum, buradaki sorun bu mu?) – songyuanyao