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 不变量)。例如,向量的内部大小正确反映了所持有对象的数量,参与标志正确反映了可选对象是否持有底层对象等。
不能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 不变量)。例如,向量的内部大小正确反映了所持有对象的数量,参与标志正确反映了可选对象是否持有底层对象等。