Мы могли бы написать функцию<convert>немного иначе, так что она имеет одно<return>-утверждение:
boost::optional<int> convert(const std::string& text)
{
boost::optional<int> ans;
std::stringstream s(text);
int i;
if ((s >> i) && s.get() == std::char_traits<char>::eof())
ans = i;
return ans;
}
Конструктор по умолчанию<optional>создает унифицированный необязательный объект. В отличие от<int>вы не можете иметь<optional<int>>в неопределенном состоянии. Его состояние всегда четко определено. Инструкция<ans=
i>инициализирует необязательный объект. Он использует «смешанное» назначение из<int>. В общем, для<optional<T>>, когда задание от<T>вызывается, он может сделать две вещи. Если факультативный объект не инициализирован (наш случай здесь), он инициализирует содержащееся значение с помощью конструктора копий<T>. Если факультативный объект уже инициализирован, он присваивает ему новое значение, используя присвоение копии<T>.