std :: nullopt_t构造函数理由



此页面上所述,

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

最新更新