Конструкция по умолчанию std :: необязательный с неизвестным значением - PullRequest
0 голосов
/ 09 ноября 2018
auto Lambda=[](auto& opt) {
    opt=<default constructor of opt::value_type>;
};

std::optional<std::string> optstr;
Lambda(optstr);
std::optional<int> optint;
Lambda(optint);

Здесь я хочу, чтобы Lambda мог инициализировать opt ... но я не могу сказать std::string(), потому что тогда, когда он вызывается с int, у меня будет ошибка.

Я пытался decltype, но не смог его скомпилировать.

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете использовать:

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
...