4

可能重复:
nullptr 到底是什么?

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

void *&p = nullptr;

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

错误:从“std::nullptr_t”类型的右值初始化“void*&”类型的非常量引用无效</p>

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

#define NULL nullptr

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

4

5 回答 5

10

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

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

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

这样做#define NULL nullptr不应该改变行为,除非您确实NULL在诸如 的上下文中使用,因为它不能被视为整数文字,所以int i = 4; if(NULL == i) {}它不起作用。nullptrnullptr

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

于 2011-07-12T12:31:10.947 回答
6

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

阅读这些,

于 2011-07-12T12:33:39.887 回答
4

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

于 2011-07-12T12:35:58.717 回答
3

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

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

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

于 2011-07-12T12:30:40.070 回答
3

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

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

void* p = nullptr;
int i = 0;

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

void*& p = nullptr; // Invalid
int& i = 0; // Invalid
于 2011-07-12T12:40:25.913 回答