为啥 std::optional 对 std::nullopt 类型的操作数有一个特殊的相等运算符

Posted

技术标签:

【中文标题】为啥 std::optional 对 std::nullopt 类型的操作数有一个特殊的相等运算符【英文标题】:Why does std::optional have a special equality operator for operand of the type std::nullopt为什么 std::optional 对 std::nullopt 类型的操作数有一个特殊的相等运算符 【发布时间】:2021-09-22 22:28:24 【问题描述】:

类模板std::optional有转换构造函数

constexpr optional(nullopt_t) noexcept;

那么问题来了,为什么在 C++ 标准中声明了特殊的单一相等运算符

template<class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;

std::nullopt 何时仅用作第二个操作数?

(参见例如 C++ 20 Draft N 4860

// 20.6.7, comparison with nullopt
template<class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;

)

引入这个特殊运算符的原因是什么?

【问题讨论】:

因为miracles. 我不明白你的问题。你对人们想写if (o == std::nullopt) 感到惊讶吗? @BrianBi 我很惊讶没有运算符模板 constexpr bool operator!=(const optional&, nullopt_t) noexcept;或模板 constexpr bool operator==(nullopt_t, const optional&) noexcept; @VladfromMoscow 看着 n4713,他们曾经在那里 @VladfromMoscow 见 4) 重写候选: 在en.cppreference.com/w/cpp/language/overload_resolution "..对于相等运算符表达式 x==y 和 x!=y,合成候选两个参数的顺序颠倒被添加..." 【参考方案1】:

您正在查看 C++20 草案。不迟于N4820 的草稿具有所有相等运算符。由于 rewritten candidates 的引入,它们后来 [可能] 被删除。

【讨论】:

以上是关于为啥 std::optional 对 std::nullopt 类型的操作数有一个特殊的相等运算符的主要内容,如果未能解决你的问题,请参考以下文章

为啥允许将 std::optional 与值进行比较? [复制]

为啥 std::optional 构造函数使用 std::in_place?

为啥 std::optional::value() &&;返回 &&?

为啥 const rvalue 限定 std::optional::value() 返回 const rvalue 引用?

为啥 std::optional 不允许“移动构造和仅复制分配”类型的移动分配?

为啥 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?