首页 > 解决方案 > 未知 value_type 的默认构造 std::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但无法编译。

标签: c++constructoroptional

解决方案


您可以使用:

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

推荐阅读