Here http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3793.html#optional.nullopt被描述为nullopt_t
and nullopt
为了optional
建议为 C++ 提供的对象:
struct nullopt_t{see below};
constexpr nullopt_t nullopt(unspecified);
[...]
nullopt_t 类型不应有默认构造函数。它将是一个
文字类型。常量 nullopt 应使用参数初始化
字面量类型。
其原因在op = {} 语法 http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3793.html#rationale.reset_syntax文件章节:对于op = {}
为了明确起见,必须采用一些技巧,其中之一是nullopt_t
不能是默认可构造的。
我的问题是文字类型在这里意味着什么?我找到了这个SO post https://stackoverflow.com/questions/18581443/need-clarification-on-definition-of-literal-type。所以在我看来,只需另一个空类就可以了。它也可能是一个构造函数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{});
Or this:
struct nullopt_t {
nullopt_t() = delete;
constexpr nullopt_t(int) {};
};
constexpr nullopt_t nullopt(0);
最小的实现是
struct nullopt_t {
constexpr nullopt_t(int) {}
};
不会隐式声明默认构造函数,[class.ctor]/4:
如果类没有用户声明的构造函数X
,一个构造函数
没有参数被隐式声明为默认值(8.4)。
... and nullopt_t
可以构造自int
,文字类型。
请注意,在您的代码中存在默认构造函数,尽管被定义为已删除。
上面的定义确实满足文字类型的要求:
类型是一个文字类型如果是:
(10.5) — 类类型(第 9 条)
具有以下所有属性:
- 它有一个简单的析构函数,
- 它是一种聚合类型(8.5.1)或至少有一个
constexpr
构造函数 [..] 不是复制或移动构造函数,并且
- 它的所有非静态数据成员和基类都是非易失性文字类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)