默认构造std ::可选,未知value_type

时间:2018-11-09 11:13:07

标签: c++ constructor optional

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 :(得分:2)

您可以使用:

auto temp = typename std::decay_t<decltype(opt)>::value_type{};

在您的lambda内。或者:

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