【问题标题】:How is nullptr defined?nullptr 是如何定义的?
【发布时间】:2018-08-18 20:30:42
【问题描述】:

Effective Modern C++,“Iterm 8:Prefer nullptr to 0 and NULL.”,第 59 页,它说:

nullptr 的实际类型是 std::nullptr_t,并且,在一个奇妙的循环定义中,std::nullptr_t 被定义为 nullptr 的类型。

一个奇妙的循环定义?

这是怎么来的?

【问题讨论】:

  • 这是编译器本身的一个技巧
  • 实际?这是一个错误的引用吗?
  • 你可以找到一些解释here
  • 这句话具有误导性。虽然nullptr的类型是std::nullptr_t,但是标准并没有用它来定义nullptr。所以没有循环定义。 nullptrstd::nullptr_t 的行为由分散在标准中的各种语句定义。
  • @Eljay:这将产生一个非空的std::nullptr_t *

标签: c++ c++11 nullptr


【解决方案1】:

简而言之,nullptr 是一个可以分配给指向任何类型的指针的值,它在布尔上下文中为 false(不像大多数指针是 new/malloc 的结果,或者引用一个有效的object),尽管它本身是一个有效的指针,但取消引用它会导致 UB,就像 in/递减它一样,它是单例类型 nullptr_t 的唯一值。

类似的东西。

【讨论】:

  • 读起来像一个随机指针,不包含 malloc/new 返回的值或地址操作符返回的值,当转换为 bool 时,会神奇地评估为 false
  • @M.M: 以及new(例如new (std::nothrow)
  • "尽管它本身是一个有效的指针" -- nullptr 不是一个指针,不能被取消引用。它可以隐式转换为指针类型,然后取消引用它会导致 UB,但nullptr 本身,没有。
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2011-11-04
  • 2023-03-27
  • 1970-01-01
  • 2020-07-31
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多