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

上一篇: Can the NULL macro actually be a nullptr?

下一篇: Why can't you take the address of nullptr?