Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获得一个非空的可选值,其中的值是默认构造的?_C++_C++17_Optional_Default Constructor - Fatal编程技术网

C++ 如何获得一个非空的可选值,其中的值是默认构造的?

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::optional的默认对象,因此为空

是的,
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{};