std :: optional

时间:2016-12-21 15:49:00

标签: c++ optional c++17 default-constructor

无法std::optional<T>成为trivially default constructible

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

1 个答案:

答案 0 :(得分:4)

如果您将其简单地设为默认构造,则在以下声明中:

std::optional<int> o;

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

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

std::optional<int> o{};

但封装的目的是以这样一种方式设计你的类,无论有人用你的类写什么法律代码,这个类的对象总是处于有效状态(2 )。即你需要保证无论你的对象是如何被操纵的,它都不会被打破#34;。

(1)除非它是全局/静态的,在这种情况下,所涉及的内部表示将被零初始化(感谢Nicol Bolas指出它)

(2)请注意,这里的有效状态是指数据成员的所有值都有意义的状态(它们满足类不变量)。例如,向量的内部大小正确地反映了所持有的对象的数量,如果可选的是否包含基础对象,则所使用的标志正确地反映,等等。