【发布时间】:2019-09-13 21:03:41
【问题描述】:
忽略用户定义的运算符重载,是否存在if (!x) 的行为与if (x == nullptr) 不同的情况。或者,相反地,if(x) 的行为是否与if (x != nullptr) 不同。
例如标准库中是否存在!x 的行为与x == nullptr 不同的类型。
注意:我知道这与 SO 上的许多其他问题非常相似,但相信它仍然值得提出自己的问题。我在这里给出了我的理由:Are questions about NULL sufficiently different from questions about nullptr?
此外,L.F. 在那篇元帖子中指出std::optional<T*> 就是这样一种情况。但是,我很想知道是否还有其他类型,尤其是原始类型和/或指针类型。
【问题讨论】:
-
std::optional<T*>不符合用户定义的运算符重载条件吗? -
@Eljay 怎么样?标准库定义了operator bool 和operator !=,不需要用户重载。
-
它们不是核心代码,它们是标准库中的运算符重载。我不确定你在哪里画“忽略用户定义的运算符重载”的界限。
-
@Eljay 啊,是的。这就是我指定“用户定义”的原因——标准库重载可以预期行为合理,但用户可以定义奇怪的重载。
-
取决于
x的类型。将int与nullptr进行比较将无法编译。