为什么std :: nullopt_t的一部分是C 标准的一部分

Why is std::nullopt_t part of the C++ standard?

本文关键字:一部分 标准 std nullopt 为什么      更新时间:2023-10-16

我不明白将std::nullopt_t纳入标准的原因。它是为了方便起见而严格存在的,还是在某些利基环境中需要?

要清楚,我知道它被用作构造空std::optional对象的参数。但是考虑到std::optional的默认构造函数已经存在,似乎没有明显的std::nullopt_t的动机。对于std::optional,是否存在这样的构造函数和分配操作员来符合特定概念?如果是这样,哪个概念?

nullopt_t是指示脱离optional状态的nullopt的类型。nullopt允许歧义过载,例如(例如optional提案中(:

void run(complex<double> v);
void run(optional<string> v);
run(nullopt);              // pick the second overload
run({});                   // ambiguous

这是我遇到的另一个示例:

// GCC: error: expected primary-expression before '{' token
// Clang: error: initializer list cannot be used on the right hand side of operator ':'
std::optional<int> x = some_condition ? std::optional(0) : {}; 
// works
std::optional<int> y = some_condition ? std::optional(0) : std::nullopt;

c 参考文献说明了一切:

std::nullopt_t是一种空的类类型,用于指示具有非初始化状态的optional类型。特别是,std::optional具有一个nullopt_t作为单个参数的构造函数,该参数创建不包含值的optional

std :: nullopt_t