Почти ничего в библиотеке std не уточнено.
Что касается value
, он возвращает ссылку на значение. Если у вас есть метод с квалификацией rvalue, возвращающий ссылку на внутреннее состояние, у вас есть два варианта.
Вы можете вернуть значение или вернуть ссылку на значение.
Если вы возвращаете значение, это означает, что .value()
для необязательного значения rvalue выполняет перемещение, а .value()
для необязательного значения lvalue - нет. Это может быть удивительно.
Стоимость .value()
возврата rvalue заключается в том, что ссылочное продление срока службы не применяется. Стоимость .value()
возврата копии по значению r - это стоимость перемещения плюс неожиданность того, что она ведет себя по-другому.
У обоих есть недостатки. У меня есть память об этом, являясь предметом обсуждения в дизайне факультативного. Если моя память верна, это означает, что решение было принято с открытыми глазами.
Если исключить экстремальное улучшение ссылочного продления времени жизни, функции для значений r, возвращающие значения во внутреннее состояние, всегда будут связываться с const&
и не продлевают время жизни внешнего объекта.
Реальная болевая точка в моем опыте - for(:)
петли;
std::optional<std::vector<int>> try_get_vec();
for (int x : try_get_vec().value()) // I know the optional won't be empty
Вышеуказанное имеет висячую ссылку.