std::optional 的简单默认构造函数

Trivial default constructor for std::optional

不能std::optional<T>trivially default constructible吗?

似乎唯一的障碍是 engaged 标志的初始化,但零初始化不能处理这种情况吗?

如果你想让它成为默认可构造的,那么在下面的声明中:

std::optional<int> o;

engaged 标志(或等效的内部表示)将未初始化 (1).

正确,用户可以使用正确的初始化:

std::optional<int> o{};

但是封装的要点是设计你的class,无论别人用你的class写什么合法的代码,这个class的对象都会始终处于有效状态 (2)。 IE。你需要保证无论你的对象如何被操纵它永远不会 "break".


(1) 除非它是 global/static,在这种情况下,engaged 的​​内部表示将被零初始化(感谢 Nicol Bolas 指出)

(2) 请注意,这里所说的有效状态是指数据成员的所有值都有意义的状态(它们满足 class 不变量)。例如,向量的内部大小正确反映了所持有对象的数量,参与标志正确反映了可选对象是否持有底层对象等。