如何使用0值的对象初始化指针

mod*_*ler 5 c++ constexpr c++11

在"C++ Primer,5th ed",第2.4.4节中,整个部分解释了"constexpr".然后在书中给出了如下练习:

练习2.32:以下代码是否合法?如果没有,你怎么能让它合法?

int null = 0, *p = null;
Run Code Online (Sandbox Code Playgroud)

我知道修复它的一种快速方法是将其更改为*p = nullptr或NULL,或使用reinterpret_cast.但我认为这本书的目的是使用与constexpr相关的东西.所以我的问题是,如何正确解决上述问题?(我认为本书的目的是将p的值初始化为0,而不是null的地址.)

我在下面进行了试验但是在编译时都失败了:

试用1,添加constexpr:

constexpr int null = 0; 
int *p = null;
Run Code Online (Sandbox Code Playgroud)

试验2,加上const;

const int null = 0;
int *p = null;
Run Code Online (Sandbox Code Playgroud)

(我根据第4.11.2章其他隐式转换中的措辞进行了此试验:"常量整数值为0,文字nullptr可以转换为任何指针类型;")

先感谢您.(原因被问为一个新问题:这是一个新的问题,希望找到一个解决方案.还有另一个密切相关的问题,但没有给出建议的解决方案这个constexpr整数不是空指针常量吗?)

eca*_*mur 5

标准 (4.10 [conv.ptr] )的实际措辞是:

1 -空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为零或类型 prvalue std::nullptr_t。空指针常量可以转换为指针类型;结果是该类型的空指针值[...]

的问题null是,尽管它是一个完整的常量表达式与零值,它是一个左值(即,它是对象的名称)等一个prvalue

获得整数常量纯右值的一些方法:

constexpr int null = 0; 
int *p = +null;
Run Code Online (Sandbox Code Playgroud)

通过null使用一元算术运算符作为前缀,+我们得到一个纯右值

const int null = 0;
int *p = static_cast<int>(null);
Run Code Online (Sandbox Code Playgroud)

static_cast到非引用类型产生一个prvalue