C++ 如何获得一个非空的可选值,其中的值是默认构造的?
假设我构造了一个类型为std::optional的默认对象,因此为空 是的,C++ 如何获得一个非空的可选值,其中的值是默认构造的?,c++,c++17,optional,default-constructor,C++,C++17,Optional,Default Constructor,假设我构造了一个类型为std::optional的默认对象,因此为空 是的,std::vector可以在没有std::optional的帮助下表达空的概念,但请耐心听我说 然后让我们假设,基于某种逻辑,我决定我必须用一个向量来填充它,在这个向量上我想一个接一个地向后推元素。我该怎么办 在我看来,以下内容有点难看: ov=decltype(ov)::值\类型{}; 推回(/*某物*/); v.推回(/*其他东西*/); 这真的是这样吗?对于任何默认可构造类型T,您可以通过std::optiona
std::vector
可以在没有std::optional
的帮助下表达空的概念,但请耐心听我说
然后让我们假设,基于某种逻辑,我决定我必须用一个向量来填充它,在这个向量上我想一个接一个地向后推元素。我该怎么办
在我看来,以下内容有点难看:
ov=decltype(ov)::值\类型{};
推回(/*某物*/);
v.推回(/*其他东西*/);
这真的是这样吗?对于任何默认可构造类型
T
,您可以通过std::optional(std::in_place)
使用默认构造的T
创建一个可选。这将执行无参数的就地施工
如果您已经有了这样一个可选的
实例,只需在其上调用obj.emplace()
。最简单的方法是
std::optional<std::vector<int>> ov = {{}};
然后
做这项工作。如果你翻过std::optional
的CPP参考页,他们会发现这个漂亮的方法也可以用std::in__位置
来区分“默认构造optional
”和“构造一个起始值为默认构造的optional
”@NathanPierson非常迂腐,可以使用就地构造函数对对象进行值初始化,而不是默认初始化。但幸运的是,OP谈论的是一个向量,在这种情况下,它们是相同的东西。
std::optional<std::vector<int>> ov(std::in_place);
struct non_empty {
template<class T>
constexpr operator std::optional<T>()const{ return {{}}; }
};
ov = non_empty{};