可能重复:
What exactly is nullptr?
我首先认为它是一个关键字。我目前的gcc并没有以不同的色调突出nullptr
。为了验证这一点,我写了以下内容:
void *&p = nullptr;
所以我从错误中得到了一些线索:
错误:'void *&'类型的非const引用的初始化无效 来自'std :: nullptr_t'
类型的右值
如果nullptr
是一个对象,那么它真的是一个简单0
的指针吗?换句话说,假设我写道:
#define NULL nullptr
以上陈述是否不会改变我的代码中的任何内容?此外,了解std::nullptr_t
类型的其他用例将会很有趣。
答案 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