空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?

What is the difference between a null pointer constant (nullptr), a null pointer value and a null member pointer value?

本文关键字:空指针 指针 之间 区别 什么 成员 常量 nullptr      更新时间:2023-10-16

在ISO/IEC 14882:2017(C++17(中,第5.13.7节"指针文字"指出:

5.13.7 指针文字 [lex.nullptr]

指针文字:空

1 指针文字是关键字 nullptr。它是 std::nullptr_t 类型的 prvalue。[注意:std::nullptr_t 是一种独特的类型,它既不是指针类型,也不是指向成员类型的指针;相反,此类型的 prvalue 是空指针常量,可以转换为空指针值或空成员指针值参见 7.11 和 7.12。—尾注]

下面,nullptrstd::nullptr_t类型的 prvalue 。类型std::nullptr_t的 prvalue 是空指针常量;因此nullptr是一个空指针常量。空指针常量(nullptr也是如此(可以转换为空指针值或空成员指针值。

现在我在引用的ISO/IEC 14882:2017的第7.11节"指针转换"中:

空指针常量是值为零或 std::nullptr_t 类型的 prvalue 的整数文本 (5.13.2(。空指针常量可以转换为指针类型;结果是该类型的 null指针值,并且可以与对象指针或函数指针类型的所有其他值区分开来。

我知道空指针常量是值为零或 prvalue 为std::nullptr_t的整数文字,但我不明白与空指针值和空成员指针值的区别。我不明白从空指针常量转换为指针类型的结果如何是"该类型的空指针值"以及该上下文中的空指针值是什么。

我的问题是:

  • 空指针常量(nullptr(、空指针值和空成员指针值有什么区别?

空指针常量 (nullptr(、空指针值和空成员指针值之间有什么区别?

空指针常量是 nullptr(或类型std::nullptr_t的任何其他 prvalue (,或值为 0 的整数文本。空指针常量的示例:

NULL  // a macro for one of the others
0
0L
nullptr
std::nullptr_t fun();
fun() // also a null pointer constant

其中,不要使用整数文本或 NULL,除非需要支持早于 C++11 的标准。

空指针值是表示空的指针类型的值。空指针值的示例:

(void*)nullptr     // pointer to void
(int*)nullptr      // pointer to object
using void_fun = void();
(void_fun*)nullptr // pointer to function

空成员指针值是表示空的成员指针类型的值。空成员指针值的示例:

(int some_class::*)nullptr // pointer to data member
using mem_void_fun_ptr = void(some_class::*)(); // unfortunately cannot alias member
// function type as far as I know,
// so we alias pointer to it instead
(mem_void_fun_ptr)nullptr  // pointer to member function

请注意,std::nullptr_t不是指针类型,也不是指向成员类型的指针。