正如this page所述,
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
?这两种实现有何不同?
答案 0 :(得分:3)
为什么
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{});