NULL宏实际上可以是nullptr吗?

αλε*_*λυτ 41 c++ null nullptr language-lawyer

根据标准N4713(7.11/1)的草案:

空指针常量是一个整数文字(5.13.2),其值为零或prvalue类型std::nullptr_t.

和21.2.3/2:

NULL是一个实现定义的空指针常量.

以下NULL可以定义为nullptr.cppreference上提到了相同的内容:

#define NULL 0
//since C++11
#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)

同时"Additive operators"条款说(8.5.6/7):

如果将值0添加到空指针值或从空指针值中减去该值,则结果为空指针值.如果减去两个空指针值,则结果将等于0转换为该类型的值std::ptrdiff_t.

因此,以下代码应该是有效的:

0 + nullptr; 
nullptr - nullptr; 
Run Code Online (Sandbox Code Playgroud)

但由于缺乏+/-运营商对于std::nullptr_t代码是无效的.

有没有我没有考虑到的东西或NULL宏不能实际定义为nullptr

Bau*_*gen 48

虽然nullptr是空指针常量,但它不是空指针.后者是某种指针类型的值,但std::nullptr_t不是.

参考:

空指针常量是一个整数文字(5.13.2),其值为零或prvalue类型std::nullptr_t.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开.这种转换称为空指针转换.[...]

N4659中的7.11/1,强调我的

所以NULL确实可以nullptr不提供算术运算符.

  • @ Cheersandhth.-Alf - 不,他值得投票,因为标准文本将*null指针值*视为一个术语,而不仅仅是*value*.如果你想要疏通过去的遭遇,那么你不要去指责他人获取个人信息. (6认同)
  • 我需要新的眼睛.对困惑感到抱歉! (3认同)
  • @ Cheersandhth.-Alf很抱歉,但是我没有看到*"`nullptr`本身不是指针值也不是指针.因此算术运算不适用于`nullptr`"*如果*"它是不正确的指针是正确的价值"*错了. (2认同)
  • @ Cheersandhth.-Alf C++ 17 7.11/1"A*null指针常量*是一个整数字(5.13.2),其值为零或prvalue类型为`std :: nullptr_t`.可以转换空指针常量到指针类型;结果是该类型的*null指针值*,并且可以与对象指针或函数指针类型的每个其他值区分开.这种转换称为*null指针转换.*"这似乎很清楚表示`nullptr`(或`std :: nullptr_t`类型的任何其他prvalue)*不是*"空指针值". (2认同)
  • @ Cheersandhth.-Alf无论它是否是一个值是不可能的,但它在哪里说它是一个空指针值? (2认同)

eer*_*ika 8

nullptr是一个空指针文字,虽然转换nullptr为指针类型的结果是空指针值,但nullptr它本身不是指针类型,而是类型std::nullptr_t.如果您将转换nullptr为指针类型,则算法有效:

0 + (int*)nullptr; 
(int*)nullptr - (int*)nullptr;
Run Code Online (Sandbox Code Playgroud)

NULL宏实际上可以是nullptr吗?

是的,因为nullptr是一个空指针文字.

请注意,在C++ 11之前,C++中的所有空指针文字也恰好是整数文字,因此这个错误代码:char c = NULL;用于实际工作.如果NULL定义为nullptr,则该代码不再有效.


n. *_* m. 6

另外,两个操作数都应具有算术或未操作的枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或无范围的枚举类型.

对于减法,以下之一应保持:
(2.1)两个操作数都具有算术或无范围的枚举类型; 或
(2.2)两个操作数都是指向同一完全定义的对象类型的cv限定版本或cv非限定版本的指针; 或
(2.3)左操作数是指向完全定义的对象类型的指针,右操作数具有整数或无范围的枚举类型.

std::nullptr_t不是那些,因此std::nullptr不能参与添加剂操作.

请注意,即使所有指针值都不能参与.例如,函数指针值和void指针值不能,即使任何一个都可以是空指针值.


S.M*_*.M. 5

关键字nullptr表示指针文字.这是一种prvalue类型std::nullptr_t.存在从nullptr任何指针类型的空指针值到任何指向成员类型的指针的隐式转换. nullptr本身不是指针值也不是指针.因此算术运算不适用于nullptr.