Постоянная ссылка только продлевает время жизни функции локальных временных. В строке
const auto& v = myval{7}.addone();
ваша ссылка не является временной привязкой. addone
возвращает по ссылке, что означает, что вы работаете с lvalue вместо временного, и, следовательно, когда закончится полное выражение, у вас останется ссылка на объект, который больше не существует.
Относительно правок,Чтобы сделать
const auto& v = myval{7}.addone();
, я бы изменил addone
так, чтобы он возвращался по значению наподобие
myval addone() && {
i[0]++;
return std::move(*this);
}
Это даст вам правильное поведение при перемещении объекта во временное состояние, которое вы затемпродлите время жизни.
Для
const auto& s = std::string("hi")[1];
std::cout << s;
Ваш код имеет неопределенное поведение и, к сожалению, вы получаете то, что ожидаете. Вы делаете то же самое, что и в предыдущем примере, и вы не получаете продления времени жизни созданной вами временной строки.