假设我有一个默认构造的对象ov
,因此为空,类型为std::optional<std::vector<int>>
。
是的,std::vector
可以在没有std::optional
的帮助下表达空的概念,但请耐心等待。
然后让我们说,基于一些逻辑,我决定用一个向量来填充它,我想在这个向量上逐个push_back
元素。我该怎么办?
在我看来,以下内容有点难看:
ov = decltype(ov)::value_type{};
ov.push_back(/* something */);
ov.push_back(/* something else */);
真的是这样吗?
对于任何默认的可构造类型T
,您可以通过std::optional<T>(std::in_place)
创建一个具有默认构造T
的optional<T>
。这将在没有参数的情况下进行现场施工。
如果你已经有这样一个optional<T>
实例,你可以简单地在它上调用obj.emplace()
最简单的方法是
std::optional<std::vector<int>> ov = {{}};
替代方案包括
std::optional<std::vector<int>> ov(std::in_place);
遗憾的是,没有办法通过分配而不是施工来做到这一点;{{}}
是不明确的,而std::in_place
构造函数是显式的。
你必须打电话给ov.emplace()
。
您可以创建一个辅助对象;
struct non_empty {
template<class T>
constexpr operator std::optional<T>()const{ return {{}}; }
};
然后
ov = non_empty{};
做这项工作。