【发布时间】:2023-03-17 00:35:01
【问题描述】:
在 ISO/IEC 14882:2017 (C++17) 中,第 5.13.7 节“指针文字”规定:
5.13.7 指针字面量 [lex.nullptr]
指针字面量:nullptr
1 指针字面量是关键字 nullptr。 它是 std::nullptr_t 类型的纯右值。 [注意:std::nullptr_t 是一个独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的纯右值是一个空指针常量,可以转换为一个空指针值或空成员指针值。见 7.11 和 7.12。 ——尾注]
以下,nullptr 是 std::nullptr_t 类型的纯右值。 std::nullptr_t 类型的纯右值是一个空指针常量;因此nullptr 是一个空指针常量。空指针常量(nullptr 也是如此)可以转换为空指针值或空成员指针值。
现在我在 ISO/IEC 14882:2017 的第 7.11 节“指针转换”中引用了:
空指针常量是一个整数文字 (5.13.2),其值为 0 或 std::nullptr_t 类型的纯右值。空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的所有其他值区分开来。
我知道空指针常量是一个整数文字,其值为零或类型为std::nullptr_t 的纯右值,但我不了解空指针值和空成员指针值的区别。我不明白从空指针常量到指针类型的转换结果如何是“该类型的空指针值”以及该上下文中的空指针值是什么。
我的问题是:
- 空指针常量(即
nullptr)、空指针值和空成员指针值有什么区别?
【问题讨论】:
-
你见过7.11和7.12你被指的吗?那里有术语“空指针值”和“空指针常量”的正式定义。 TLDR;整数变量的值可能为 0。该值可能以不同的方式在语法上表示 - 例如
0,0x0,1-1;这些是常量或常量表达式,具有值0。同样,每个指针类型都有一个空值。有许多不同的方法可以在程序文本中用词法表示空指针值 - 例如nullptr或0。这些方式统称为“空指针常量”。 -
@FrançoisAndrieux 是的。
-
每种类型都有一组值。每种指针类型在该集合中都有一个特殊值,与其他类型不同,称为“空指针值”。该值具有其他值所没有的某些属性;例如已知具有此值的指针不指向任何有效对象;取消引用这样的指针会表现出未定义的行为。现在,有一种方法可以在程序的文本中表达这个值是很有用的。为此,任何满足“空指针常量”要求的语法结构,在转换为指针类型时,都会产生该类型的空指针值。
-
@RobertSsupportsMonicaCellio 是的。
-
NULL是一个宏,在许多实现中,它只是扩展为0。它没有什么神奇之处。像这样的东西可能会编译:int x = NULL;这就是为什么发明了nullptr-int x = nullptr;不能编译,所以使用nullptr而不是NULL可以防止一些无意义的代码。
标签: c++ pointers null literals nullptr