Когда я запускаю следующий код:Почему операторы стандартной библиотеки C++ принимают значения rvalues?
std::string myString = "I'm a string.";
const std::string::iterator &myIterator = ++myString.begin();
char c = *myIterator;
std::cout << c << std::endl;
я получаю ошибку сегментации (компиляции с оптимизацией O3). Я предполагаю, что это связано с тем, что оператор ++
возвращает std::string::iterator &
, а не std::string::iterator
, и поэтому мы получаем ссылку на временный. Есть ли причина, почему это не реализовано, чтобы вызвать ошибку компиляции? I.e., почему подпись не является следующей?
std::string::iterator &std::string::iterator::operator++() &;
Или еще лучше, почему не требуют спецификаций следующих подписей, чтобы мы могли справиться rvalues без проблем?
std::string::iterator &std::string::iterator::operator++() &;
std::string::iterator std::string::iterator::operator++() &&;
[Невозможно воспроизвести] (https://ideone.com/I9Z8De). Вы уверены, что это из-за этих строк? На стороне примечания, даже если '++' возвращает ссылку, 'myIterator' не является ссылкой, поэтому он скопирует значение – Rakete1111
. Это работает нормально. Можете ли вы отправить полный код? – Sumeet
Да, вы правы. Я изменил этот пример, и теперь он должен потерпеть крах. –