Когда я запускаю следующий код:
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
, и поэтому мы получаем ссылку на временное. Есть ли причина, по которой это не реализовано, чтобы вызвать ошибку компиляции? То есть, почему подпись не следующая?
std::string::iterator &std::string::iterator::operator++() &;
Или, что еще лучше, почему спецификация не требует следующих подписей, чтобы мы могли без проблем обрабатывать rvalue?
std::string::iterator &std::string::iterator::operator++() &;
std::string::iterator std::string::iterator::operator++() &&;
++
возвращает ссылку,myIterator
не является ссылкой, поэтому значение будет скопировано. - person Rakete1111   schedule 31.05.2016++
для prvalue, в первую очередь, немного подозрительно, встроенный ++ можно использовать только для lvalue. Но многие люди, кажется, довольны этим. - person M.M   schedule 01.06.2016char *
в качестве строкового итератора. - person M.M   schedule 01.06.2016char c = *(++myString.begin())
), но ваши два других комментария эффективно демонстрируют, как предложенная мной идиома приведет к несогласованности. - person Jeremy B.   schedule 01.06.2016