【发布时间】:2018-07-31 22:08:04
【问题描述】:
根据标准草案N4713(7.11/1):
空指针常量是一个整数文字 (5.13.2),其值为 0 或类型为
std::nullptr_t的纯右值。
和 21.2.3/2:
宏
NULL是一个实现定义的空指针常量。
遵循NULL 可以定义为nullptr。 cppreference 也有提到:
#define NULL 0
//since C++11
#define NULL nullptr
同时“加法运算符”子句说 (8.5.6/7):
如果将值
0与空指针值相加或减去,则结果为空指针值。如果两个空 减去指针值,结果比较等于转换为类型std::ptrdiff_t的值0。
因此下面的代码应该是有效的:
0 + nullptr;
nullptr - nullptr;
但由于 std::nullptr_t 和 code is invalid 缺少 +/- 运算符。
是否有什么我没有考虑到或者NULL 宏实际上不能定义为nullptr?
【问题讨论】:
-
是的,它可以。 [[[[[[[[[[
-
“有什么我没有考虑到的”,是的,你可以在字面量 0 上加 0。
-
空指针value和空指针constant是两个截然不同的东西。
-
@Cheersandhth.-Alf 是值,但不是“空指针值”。
-
@Cheersandhth.-Alf 当然是
std::nullptr_t类型的值,它不是指针类型,所以没有理由称它为“空指针值”(它不是指针完全有价值)。无论如何,“加法运算符”子句列出了可能参与加法运算符的类型,而std::nullptr_t不是其中之一,因此无论您是否调用std::nullptr“空指针值”,std::nullptr - std::nullptr都是无效的。
标签: c++ null language-lawyer nullptr