Вы можете использовать:
auto temp = typename std::decay_t<decltype(opt)>::value_type{};
внутри вашей лямбды. Или:
auto temp = typename std::remove_cvref_t<decltype(opt)>::value_type{};
в C ++ 20.
decltype(opt)
сам по себе не работает, поскольку вы передаете opt
по ссылке, поэтому его тип является ссылкой на std::optional
. Поэтому вам необходимо удалить эту ссылку из результирующего типа, чтобы получить доступ к самому std::optional
, а затем к value_type
.
Это так же, как в следующем коде:
std::optional<int>& o;
decltype(o)::value_type i{}; // error
или даже:
std::optional<int>&::value_type i{}; // error