std :: nullopt_t构造函数基本原理

时间:2016-06-17 03:17:23

标签: c++ c++11 c++14 c++17

正如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?这两种实现有何不同?

1 个答案:

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