nullptr不是特殊关键字和std :: nullptr_t的对象吗?

时间:2011-07-12 12:25:48

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

  

可能重复:
  What exactly is nullptr?

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

void *&p = nullptr;

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

  

错误:'void *&'类型的非const引用的初始化无效   来自'std :: nullptr_t'

类型的右值

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

#define NULL nullptr

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

5 个答案:

答案 0 :(得分:10)

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

  

指针文字是关键字nullptr。它是std :: nullptr_t类型的prvalue。

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

执行#define NULL nullptr不应改变行为,除非您在NULL这样的上下文中使用int i = 4; if(NULL == i) {},因为nullptr不能使用nullptr不能将其视为整数文字。

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

答案 1 :(得分:6)

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

阅读这些,

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

需要消除f(int)f(T*)之间的歧义,因此它不仅仅是0,而是nullptr_t

我不知道gcc可以突出显示代码; - )

答案 4 :(得分:3)

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

可以使用以下表达式初始化对象:

void* p = nullptr;
int i = 0;

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

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