实验::可选的nullopt_t构造函数

experimental::optional nullopt_t constructor

本文关键字:构造函数 nullopt 实验      更新时间:2023-10-16

这里描述了为c++提出的optional对象的nullopt_tnullopt

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);

是一个最小的实现

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

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

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

并且CCD_ 9可以由CCD_
请注意,在您的代码中存在一个默认构造函数,尽管它被定义为已删除。

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

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

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