无法std::optional<T>
成为trivially default constructible?
似乎唯一的障碍是engaged
标志的初始化,但是没有零初始化处理这种情况?
答案 0 :(得分:4)
如果您将其简单地设为默认构造,则在以下声明中:
std::optional<int> o;
engaged
标志(或等效的内部表示)将未初始化(1)。
是的,用户可以使用正确的初始化:
std::optional<int> o{};
但封装的目的是以这样一种方式设计你的类,无论有人用你的类写什么法律代码,这个类的对象总是处于有效状态(2 )。即你需要保证无论你的对象是如何被操纵的,它都不会被打破#34;。
(1)除非它是全局/静态的,在这种情况下,所涉及的内部表示将被零初始化(感谢Nicol Bolas指出它)
(2)请注意,这里的有效状态是指数据成员的所有值都有意义的状态(它们满足类不变量)。例如,向量的内部大小正确地反映了所持有的对象的数量,如果可选的是否包含基础对象,则所使用的标志正确地反映,等等。