experimental ::可选nullopt_t构造函数

时间:2015-02-04 21:45:53

标签: c++ optional c++17

Here描述了针对c ++提出的nullopt_t对象的nulloptoptional

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

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

在文档的The op = {} syntax章节中解释了这一点的原因:因为op = {}必须采用明确的一些技巧,其中之一就是nullopt_t一定不能默认是可构造的。

我的问题是文字类型在这里意味着什么?我找到了SO post。所以在我看来,只有另一个空类才能做到。它也可能是一个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);

1 个答案:

答案 0 :(得分:5)

最小的实现是

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

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

  

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

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

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

  

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

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