【问题标题】:Is nullptr not a special keyword and an object of std::nullptr_t? [duplicate]nullptr 不是特殊关键字和 std::nullptr_t 的对象吗? [复制]
【发布时间】:2011-10-03 14:16:34
【问题描述】:

可能重复:
What exactly is nullptr?

我首先认为这是一个关键字。我目前的 gcc 没有以不同的阴影突出显示 nullptr。为了验证这一点,我写了以下内容:

void *&p = nullptr;

所以我从错误中得到了一些线索:

错误:“void*&”类型的非常量引用的初始化无效 来自“std::nullptr_t”类型的右值

如果nullptr 是一个对象,那么它真的是一个相当于简单0 的指针吗?换句话说,假设我写:

#define NULL nullptr

上述语句是否不会改变我的代码中的任何内容?此外,了解std::nullptr_t 类型的其他用例也会很有趣。

【问题讨论】:

  • gcc doesn't highlight ==> VIM editor doesn't highlight in gcc :)
  • 您的 gcc 不会“突出显示”nullptr。 gcc 是一个编译器;编译器唯一的表现是编译产生的错误和警告;希望没有。是您的编辑器将突出显示 nullptr。你的编辑没有跟上新标准的速度应该不足为奇,因为新标准还没有真正存在,至少还没有正式存在。这就是为什么它仍然被称为 C++0x 而不是 C++11。
  • What exactly is nullptr in C++0x?。您的一些问题已在此处得到解答。
  • vim C++0x 语法见这里:stackoverflow.com/questions/2977174/…
  • @eran:我认为使用 3k+ 代表,您应该已经能够投票支持以完全重复的方式关闭(这反过来会添加与您添加的评论类似的评论)。感谢您指出重复的内容!

标签: c++ pointers c++11 nullptr


【解决方案1】:

这是一个关键字,标准草案说(lex.nullptr):

指针字面量是关键字 nullptr。它是 std::nullptr_t 类型的纯右值。

nullptr 还不是指针,但可以转换为指针类型。这禁止了您的上述赋值,这是对不相关引用类型的赋值,在这种情况下无法进行转换(考虑int& a = 1.f;!)。

执行#define NULL nullptr 不应改变行为,除非您确实在诸如int i = 4; if(NULL == i) {} 的上下文中使用了NULL,这不适用于nullptr,因为nullptr 不能被视为整数字面量。

我认为std::nullptr_t 没有很多其他用例,它只是一个哨兵,因为nullptr 需要一个类型。

【讨论】:

  • +1,虽然“不应该改变行为,除非......” - 换句话说,它确实破坏了(一些)事情。 NULL 保证有一些整数类型,nullptr 不是。
  • nullptr_t 有一点用处。如果您有多个采用不同指针类型的重载,则 nullptr-to-pointer 转换将是模棱两可的。您可以使用 nullptr_t 重载来消除呼叫的歧义。
【解决方案2】:

nullptr 是表示空指针常量的关键字。它是nullptr_t 类型,可隐式转换,可与任何指针类型或指向成员的指针类型相媲美。

阅读这些,

【讨论】:

    【解决方案3】:

    nullptr 确实是一个关键字,标准要求 std::nullptr_t 类型等同于 typedef decltype(nullptr) nullptr_t; 以启用基于 nullptr 的重载。

    【讨论】:

      【解决方案4】:

      nullptr 将成为下一个 C++ 标准中的关键字,现在称为 C++0x。

      f(int)f(T*)之间需要消歧,所以不是简单的0,而是nullptr_t

      我不知道 gcc 可以高亮代码 ;-)

      【讨论】:

      • gcc 突出显示的好方法。这是一个错误。
      【解决方案5】:

      nullptr 不是一个对象,就像0 不是一个整数对象一样。前者是std::nullptr_t 类型的纯右值(即一种表达式),后者是int 类型的整数文字(也是一种表达式和纯右值)。

      可以用这样的表达式初始化一个对象:

      void* p = nullptr;
      int i = 0;
      

      不可能用这样的表达式初始化左值引用,因为它们是纯右值;左值引用只能从左值初始化。

      void*& p = nullptr; // Invalid
      int& i = 0; // Invalid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 2014-08-26
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多