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



假设我有一个默认构造的对象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)创建一个具有默认构造Toptional<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{};

做这项工作。

最新更新