αλε*_*λυτ 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不提供算术运算符.
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,则该代码不再有效.
另外,两个操作数都应具有算术或未操作的枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或无范围的枚举类型.
对于减法,以下之一应保持:
(2.1)两个操作数都具有算术或无范围的枚举类型; 或
(2.2)两个操作数都是指向同一完全定义的对象类型的cv限定版本或cv非限定版本的指针; 或
(2.3)左操作数是指向完全定义的对象类型的指针,右操作数具有整数或无范围的枚举类型.
std::nullptr_t不是那些,因此std::nullptr不能参与添加剂操作.
请注意,即使所有指针值都不能参与.例如,函数指针值和void指针值不能,即使任何一个都可以是空指针值.
关键字nullptr表示指针文字.这是一种prvalue类型std::nullptr_t.存在从nullptr任何指针类型的空指针值到任何指向成员类型的指针的隐式转换.
nullptr本身不是指针值也不是指针.因此算术运算不适用于nullptr.
| 归档时间: |
|
| 查看次数: |
3207 次 |
| 最近记录: |