此页面上所述,
std::nullopt_t
必须是LiteralType
,并且不能具有默认的构造函数。它必须具有constexpr
构造函数,该构造函数采用某些实现定义的文字类型。... 注释nullopt_t
不是DefaultConstructible
支持op = {};
和op = nullopt;
作为脱离可选对象的语法。
...而且,可能的实现是
struct nullopt_t {
constexpr nullopt_t(int) {}
};
实际上,在阅读本文后,我不太了解背后的理由。
(1)为什么要制作nullopt_t
不是DefaultConstructible
?我不太了解" ...支持两者..."部分。
(2)为什么可能的构造函数会采用int
,而boost::none_t
取空boost::none_t::init_tag
?这两个实现如何不同?
为什么要使
nullopt_t
不是DefaultConstructible
?
cppReference需要一个小修复。"不是DefaultConstructible
"不是预期语义的正确描述。 1
无论如何,目的是给定operator=(optional&&)
和operator=(nullopt_t)
,opt = {}
将明确地转到第一个,而不是引起歧义,这是通过使{}
构造nullopt_t
来完成的。请注意,"分配值" operator=
是一个模板,也使其对于= {}
也不可行。
为什么可能的CTOR会采用
int
,而boost::none_t
则采用空型boost::none_t::init_tag
?这两个实现如何不同?
标准使其未指定如何构造nullopt_t
。(您应该使用nullopt
。)因此,通常您只需添加一个构造函数 而忽略它。 取决于实施者。
1 以下病理实施符合当前工作草案中的所有要求,不是DefaultConstructible
,但仍会破坏opt = {}
:
struct nullopt_t {
constexpr nullopt_t(const nullopt_t&) = default;
};
constexpr nullopt_t nullopt(nullopt_t{});