Я только что обнаружил самую непонятную ошибку, и я не понимаю, почему компилятор не отметил это для меня. Если я напишу следующее:
string s = "abcdefghijkl";
cout << s << endl;
s.substr(2,3) = "foo";
s.substr(8,1) = '.';
s.substr(9,1) = 4;
cout << s << endl;
У компилятора нет никаких проблем с этим, и заявления присваивания, похоже, не влияют на то, что напечатано. Напротив,
s.front() = 'x';
имеет эффект, который я ожидал бы (поскольку front
возвращает ссылку на символ) изменения базовой строки и
s.length() = 4;
также имеет ожидаемый эффект от генерирования ошибки компилятора, жалуясь на то, что вы не можете назначить то, что не является lvalue, потому что length
возвращает целое число. (Ну, a size_t
в любом случае.)
Итак... почему компилятор не жалуется на назначение результата вызова substr
? Он возвращает строковое значение, а не ссылку, поэтому его нельзя назначать, правильно? Но я пробовал это в g++
(6.2.1) и clang++
(3.9.0), поэтому он не кажется ошибкой, и он также, похоже, не чувствителен к версии С++ ( попробовал 03, 11, 14).