c++ - 未知 value_type 的默认构造 std::optional

标签 c++ constructor option-type

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 但无法编译。

最佳答案

您可以使用:

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

关于c++ - 未知 value_type 的默认构造 std::optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53224649/

相关文章:

swift - 在哪种情况下足以使用隐式展开的可选值?

arrays - 如何从数组中删除特定对象?

c++ - 点的复制构造函数

c++ - 查找类复制构造的问题

swift - 是否会使用 Swift 的 Guard 或 if Let Keywords 来解决不必使用此 checkNil 函数的问题?

java - 链表之外的字符串,对象的高效构造函数

c++ - 引用构造函数

C++:无法使用字符串流操作打开文件

c++ - 管理 HLSL 效果

c++ - Boost Asio GCC 链接错误