NULL宏实际上可以是nullptr吗?
根据标准N4713(7.11 / 1)的草案:
空指针常量是一个整型文字(5.13.2),其值为零或类型为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
的+/-运算符,因此代码无效。
有没有我没有考虑到或NULL
宏不能被实际定义为nullptr
?
虽然nullptr
是一个空指针常量,但它不是空指针值。 后者是一些指针类型的值, std::nullptr_t
不是。
参考:
空指针常量是一个整型文字(5.13.2),其值为零或类型为std::nullptr_t
。 空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开来。 这种转换称为空指针转换。 [...]
N4659中7.11 / 1,强调我的
因此,如果不提供算术运算符, NULL
确实可以是nullptr
。
nullptr
是一个空指针文字,尽管将nullptr
转换为指针类型的结果是空指针值,但nullptr
本身不是指针类型,而是std::nullptr_t
类型。 如果您将nullptr
转换为指针类型,则该算法有效:
0 + (int*)nullptr;
(int*)nullptr - (int*)nullptr;
NULL宏实际上可以是nullptr吗?
是的,因为nullptr
是一个空指针文字。
请注意,在C ++ 11之前,C ++中的所有空指针文字碰巧也是整数文字,所以这个不好的代码: char c = NULL;
习惯于在实践中工作。 如果将NULL
定义为nullptr
,则该代码不再有效。
另外,两个操作数都应该有算术或非范围的枚举类型,或者一个操作数应该是一个指向完全定义的对象类型的指针,而另一个应该具有整型或非范型枚举类型。
对于减法,下列之一应成立:
(2.1)两个操作数都具有算术或非范围的枚举类型; 要么
(2.2)两个操作数都是指向同一个完全定义的对象类型的cv-qualified或cv-unqualified版本的指针; 要么
(2.3)左边的操作数是一个指向完全定义的对象类型的指针,右边的操作数具有整数或非范围的枚举类型。
std::nullptr_t
不是那些,因此std::nullptr
不能参与附加操作。
请注意,即使所有的指针值都不能参与。 例如,函数指针值和void指针值不能,即使两者都可以是空指针值。
链接地址: http://www.djcxy.com/p/73015.html