【问题标题】:What is the difference between a null pointer constant (nullptr), a null pointer value and a null member pointer value?空指针常量(nullptr)、空指针值和空成员指针值有什么区别?
【发布时间】: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。 ——尾注]

以下,nullptrstd::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。该值可能以不同的方式在语法上表示 - 例如00x01-1;这些是常量或常量表达式,具有值0。同样,每个指针类型都有一个空值。有许多不同的方法可以在程序文本中用词法表示空指针值 - 例如nullptr0。这些方式统称为“空指针常量”。
  • @FrançoisAndrieux 是的。
  • 每种类型都有一组值。每种指针类型在该集合中都有一个特殊值,与其他类型不同,称为“空指针值”。该值具有其他值所没有的某些属性;例如已知具有此值的指针不指向任何有效对象;取消引用这样的指针会表现出未定义的行为。现在,有一种方法可以在程序的文本中表达这个值是很有用的。为此,任何满足“空指针常量”要求的语法结构,在转换为指针类型时,都会产生该类型的空指针值。
  • @RobertSsupportsMonicaCellio 是的。
  • NULL 是一个宏,在许多实现中,它只是扩展为0。它没有什么神奇之处。像这样的东西可能会编译:int x = NULL; 这就是为什么发明了nullptr - int x = nullptr; 不能编译,所以使用nullptr 而不是NULL 可以防止一些无意义的代码。

标签: c++ pointers null literals nullptr


【解决方案1】:

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

空指针常量要么是空指针(或任何其他类型为std::nullptr_t的纯右值),要么是值为0的整数文字。空指针常量示例:

NULL  // a macro for one of the others
0
0L
nullptr

std::nullptr_t fun();
fun() // also a null pointer constant

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

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

(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 不是指针类型,也不是指向成员类型的指针。

【讨论】:

  • 也许 补充说std::nullptr_t 有时在重载函数时很有用,以获取专门为处理空指针的情况而调用的函数。但是,总而言之,很好的答案。 +1。
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 2011-05-19
  • 2013-07-12
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多