【问题标题】:Are there any differences between if (!x) and if (x == nullptr)?if (!x) 和 if (x == nullptr) 之间有什么区别吗?
【发布时间】: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 booloperator !=,不需要用户重载。
  • 它们不是核心代码,它们是标准库中的运算符重载。我不确定你在哪里画“忽略用户定义的运算符重载”的界限。
  • @Eljay 啊,是的。这就是我指定“用户定义”的原因——标准库重载可以预期行为合理,但用户可以定义奇怪的重载。
  • 取决于x 的类型。将 intnullptr 进行比较将无法编译。

标签: c++ std


【解决方案1】:

它们对于大多数原始类型都不同。

例如布尔值:

!true 有效,而true == nullptr 格式错误。

【讨论】:

  • 或者对于std::string_view!x 无法编译,但x == nullptr 表现出未定义的行为
  • 不会 true == nullptr 导致 nullptr 转换为指针,然后再转换为 false?
  • @DanielMcIntosh:这里没有转换 Demo 的编译错误。
  • AFAIR nullptr 被添加到核心中,可以隐式转换为任何内置指针类型,但不能转换为数字类型。它应该是通用指针文字,因为 0 应该是通用数字文字。由于 bool 和 std:: nullptr_t 不能相互转换,因此内置的比较运算符应该在编译时失败。
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多