experimental ::可选nullopt_t构造函数

bol*_*lov 6 c++ optional c++17

这里描述了为c ++提出的对象nullopt_t和对象:nulloptoptional

struct nullopt_t{see below}; 
constexpr nullopt_t nullopt(unspecified);
Run Code Online (Sandbox Code Playgroud)

[...]类型nullopt_t不应具有默认构造函数.它应该是文字类型.常量nullopt应使用文字类型的参数进行初始化.

其原因在文档的op = {}语法章节中进行了解释:为了op = {}明确一些必须采用的技巧,其中一个nullopt_t必须不是默认的可构造的.

我的问题是文字类型在这里意味着什么?我找到了这个SO帖子.所以在我看来,只有另一个空类才能做到.它也可以是一个构造函数int吗?

最小的整合nullopt_t课程会是什么样的?

像这样的东西:

struct nullopt_t_construct_tag_t{};

struct nullopt_t {
  nullopt_t() = delete; // I know declaring it as deleted is redundant
  constexpr nullopt_t(nullopt_t_construct_tag_t) {};
};

constexpr nullopt_t nullopt(nullopt_t_construct_tag_t{});
Run Code Online (Sandbox Code Playgroud)

或这个:

struct nullopt_t {
  nullopt_t() = delete;
  constexpr nullopt_t(int) {};
};

constexpr nullopt_t nullopt(0);
Run Code Online (Sandbox Code Playgroud)

Col*_*mbo 5

最小的实现是

struct nullopt_t {
    constexpr nullopt_t(int) {}
};
Run Code Online (Sandbox Code Playgroud)

不会隐式声明默认构造函数,[class.ctor]/4:

如果类没有用户声明的构造X函数,则没有参数的构造函数被隐式声明为默认值(8.4).

... nullopt_t可以用int文字类型构建.
请注意,在您的代码中,默认构造函数存在,但被定义为已删除.

上面的定义确实符合文字类型的要求:

类型是文字类型,如果它是:
(10.5) - 具有以下所有属性的类类型(第9节):

  • 它有一个简单的析构函数,
  • 它是一个聚合类型(8.5.1)或至少有一个constexpr构造函数[..]不是复制或移动构造函数,并且
  • 它的所有非静态数据成员和基类都是非易失性文字类型.