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

How do I obtain a non-empty optional with the value inside it being default constructed?

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

完成任务。