6

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

struct nullopt_t{see below}; 
constexpr nullopt_t nullopt(unspecified);

[...] 类型 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{});

或这个:

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

constexpr nullopt_t nullopt(0);
4

1 回答 1

5

一个最小的实现是

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

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

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

...并且nullopt_t可以从int, 文字类型构造。
请注意,在您的代码中存在一个默认构造函数,尽管被定义为已删除。

上面的定义确实满足文字类型的要求:

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

  • 它有一个微不足道的析构函数,
  • 它是一种聚合类型 (8.5.1) 或至少有一个constexpr构造函数 [..] 不是复制或移动构造函数,并且
  • 它的所有非静态数据成员和基类都是非易失性文字类型。
于 2015-02-04T22:19:32.103 回答