2015-03-18 1 views
2

Начиная с версии Boost 1.56, опция Boost опционально поддерживает семантику перемещения. В этом случае имеет смысл следующая конструкция?Возврат справки rvalue из функции, которая возвращает Boost optional

boost::optional<SomeType> getValue() 
{ 
    if (value_available) {  // value_available is a boolean 
    return std::move(value); // value is of type SomeType 
    } else { 
    return boost::none; 
    } 
} 

ответ

1

Да, это было бы значимым. Это означает, что вы переходите от value в случае, если у вас есть это.

Однако меня удивляет, что вы возвращения необязательной, когда оказывается, что семантически класс уже содержит необязательное значение (value_available является показателем того, что).

Таким образом, вместо этого я хотел бы предложить, чтобы сохранить value, как optional<T> уже и только возвращения, что

return value; // already optional! 

В этом случае вы получите соответствующие семантику перемещения и РВ бесплатно. Конечно, если value не является локальным или временным, вы должны сказать

return std::move(value); 

(Sidenote: Я не согласен с другим ответом, что это только полезно, если getValue() вызывается только один раз. Если ваш тип имеет корректное состояние «по умолчанию» для возврата к перемещению, он может стать своего рода «1-элементной очередью».)

В таком случае может быть приятно явно не инициализировать источник значение перед возвратом. Я считаю, что сложнее реализовать этот обмен безопасным способом.

Рассмотрите возможность переименования функции, например. popValue(), extractValue() или consume(), чтобы прямо указать на то, что использование этой функции перемещается из внутреннего состояния объекта. Конечно, некоторое предупреждение уже неявно присутствует в том факте, что функция-член не является const, но важно хорошее именование.

1

Было бы смысл только в том случае, если вам нужно только позвонить getValue() раз, или если ownsership семантика передачи применяются, так как она разрушает value после первого звонка.

+0

Итак, если значение было локальным для функции getValue, это имеет смысл. – CppNoob

+2

@CppNoob В этом случае компилятор, вероятно, все равно оставит копию в RVO. – Jens

+0

@MikeSeymour, как будет RVO, поскольку тип даже не соответствует? Всегда будет неявное построение необязательного. Я думаю, что я получаю то, о чем вы говорите (не делайте «заклинание» вне 'std :: move' on return), но в этом случае речь идет о написании конструкции перехода по дополнительному адресу – sehe

 Смежные вопросы

  • Нет связанных вопросов^_^