Ответ 1
Действителен переход от optional<T>::value()
, поскольку он возвращает изменчивую ссылку, и перемещение не уничтожает объект. Если экземпляр optional
не задействован, value()
выдаст исключение bad_optional_access
(§20.6.4.5).
Вы явно проверяете, включена ли опция:
if (content)
Process(move(*content));
Но вы не используете элемент value()
для доступа к базовому T
. Обратите внимание, что value()
выполняет проверку внутри, прежде чем возвращать действительный T&
, в отличие от operator*
, который имеет предварительное условие, которое должно задействовать экземпляр optional
. Это тонкая разница, но вы используете правильную идиому:
if (o)
f(*o)
в отличие от
if (o) // redundant check
f(o.value())
В Boost ситуация немного отличается: во-первых, нет функции-члена, называемой value()
, которая обеспечивает проверенный доступ. (Исключение A bad_optional_access
просто не существует). Член get()
является просто псевдонимом для operator*
и всегда полагается на пользователя, проверяющего, что задействован экземпляр optional
.