gpt4 book ai didi

c++ - std::nullopt_t 构造函数基本原理

转载 作者:行者123 更新时间:2023-11-30 02:31:22 25 4
gpt4 key购买 nike

this page 所述,

std::nullopt_t must be a LiteralType and cannot have a default constructor. It must have a constexpr constructor that takes some implementation-defined literal type. ... Notes nullopt_t is not DefaultConstructible to support both op = {}; and op = nullopt; as the syntax for disengaging an optional object.

...并且,一个可能的实现是

struct nullopt_t {
constexpr nullopt_t(int) {}
};

其实看完之后我也不太明白背后的道理。

(1) 为什么nullopt_t不是DefaultConstructible?我不太明白“...支持两者...”部分。

(2) 为什么可能的构造函数采用int,而boost::none_t采用空类型boost::none_t::init_tag?这两种实现方式有何不同?

最佳答案

Why make nullopt_t not DefaultConstructible?

cppreference 需要一个小的修复。 “not DefaultConstructible”不是预期语义的正确描述。1

在任何情况下,意图是给定 operator=(optional&&)operator=(nullopt_t)opt = {} 将明确地转到第一个,而不是引起歧义,这是通过使得不可能从 {} 构造一个 nullopt_t 来实现的。请注意,“赋值”operator= 是一个模板,因此对于 = {} 也是不可行的。

Why would a possible ctor takes an int, while boost::none_t takes an empty type boost::none_t::init_tag? How do these two implementations differ?

标准未指定如何构建 nullopt_t。 (你应该使用 nullopt。)所以通常你只是添加一个构造函数来获取 something 并忽略它。 something 究竟是什么取决于实现者。


1 以下病态实现满足当前工作草案中的所有要求,不是DefaultConstructible,但仍然打破opt = {} :

struct nullopt_t {
constexpr nullopt_t(const nullopt_t&) = default;
};

constexpr nullopt_t nullopt(nullopt_t{});

关于c++ - std::nullopt_t 构造函数基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37872533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com