En şaşırtıcı hatalarını keşfettim ve derleyicinin neden benim için işaretlemediğini anlamıyorum. Aşağıdaki yazarsanız:Neden bir alt çağrı sonucu atamak için bir derleyici hatası değil?
string s = "abcdefghijkl";
cout << s << endl;
s.substr(2,3) = "foo";
s.substr(8,1) = '.';
s.substr(9,1) = 4;
cout << s << endl;
derleyici olursa olsun hiçbir sorunu vardır ve atama ifadeleri çıktısı ne dayanarak, hiçbir etkisi görülmektedir. Buna karşılık,
s.front() = 'x';
yatan kiriş değişimi (
front
bir karakter bir başvuru verir beri) ben beklediğiniz etkiye sahiptir ve
s.length() = 4;
da bir derleyici üreten beklenen etkiye sahiptir
length
bir tamsayı döndürdüğü için bir değer olmayan bir şeye atayamayacağınız için hata oluştu. (Peki, bir
size_t
yine de.)
Peki ... neden derleyici, substr
aramasının sonucuna atama konusunda şikayet etmiyor? Bir dize değeri döndürür, bir referans değil, bu yüzden atanabilir olmamalı, değil mi? Ama bunu g++
(6.2.1) ve clang++
(3.9.0) 'da denedim, bu yüzden bir hata gibi görünmüyor ve ayrıca C++ sürümüne duyarlı görünmüyor (03, 11'i denedim) 14). koda
'Bir dize değeri döndürür, bir başvuru değil, bu yüzden atanamaz olmamalıdır Neden? Neden böyle düşünüyorsunuz? Str; str = "foo"; 'aynısını mı? – DeiDei
Elbette ama dize dizisinde; str = "foo"; ', 'str' değişkeni açıkça bir değerdir. Geçici değerler ... değil mi? Demek istediğim, int n; n = 4; 'ayrıca gayet iyi çalışıyor, ama benim üçüncü örneğim hatalar (beklediğim gibi). – blahedo
Evet, bir lvalue olmak için bir isim verilmedikçe, aşağıdaki satırda biten bir ömür boyu olan bir 'xvalue'. Fakat xvalues de değiştirilebilir olmalı. Bunu göz önünde bulundurun: cout << s.substr (2,8) .push_back ('x'); 'push_back' öğesini geçici olarak yazdırıp yazdırılmasını sağlar. Bir sonraki satırda yok edildi. – DeiDei