Да, это было бы значимым. Это означает, что вы переходите от value
в случае, если у вас есть это.
Однако меня удивляет, что вы возвращения необязательной, когда оказывается, что семантически класс уже содержит необязательное значение (value_available
является показателем того, что).
Таким образом, вместо этого я хотел бы предложить, чтобы сохранить value
, как optional<T>
уже и только возвращения, что
return value; // already optional!
В этом случае вы получите соответствующие семантику перемещения и РВ бесплатно. Конечно, если value
не является локальным или временным, вы должны сказать
return std::move(value);
(Sidenote: Я не согласен с другим ответом, что это только полезно, если getValue()
вызывается только один раз. Если ваш тип имеет корректное состояние «по умолчанию» для возврата к перемещению, он может стать своего рода «1-элементной очередью».)
В таком случае может быть приятно явно не инициализировать источник значение перед возвратом. Я считаю, что сложнее реализовать этот обмен безопасным способом.
Рассмотрите возможность переименования функции, например. popValue()
, extractValue()
или consume()
, чтобы прямо указать на то, что использование этой функции перемещается из внутреннего состояния объекта. Конечно, некоторое предупреждение уже неявно присутствует в том факте, что функция-член не является const
, но важно хорошее именование.
Итак, если значение было локальным для функции getValue, это имеет смысл. – CppNoob
@CppNoob В этом случае компилятор, вероятно, все равно оставит копию в RVO. – Jens
@MikeSeymour, как будет RVO, поскольку тип даже не соответствует? Всегда будет неявное построение необязательного. Я думаю, что я получаю то, о чем вы говорите (не делайте «заклинание» вне 'std :: move' on return), но в этом случае речь идет о написании конструкции перехода по дополнительному адресу – sehe