在“C ++ Primer,5th ed”,第2.4.4节中,整个部分解释了“constexpr”。然后在书中给出如下练习:
练习2.32:以下代码是否合法?如果没有,你怎么能让它合法?
int null = 0, *p = null;
我知道修复它的一种快速方法是将其更改为* p = nullptr或NULL,或使用reinterpret_cast。但我认为这本书的目的是使用与constexpr相关的东西。所以我的问题是,如何正确解决上述问题? (我认为本书的目的是将p的值初始化为0,而不是null的地址。)
我在下面进行了试验,但两人都没有编译:
试用1,添加constexpr:constexpr int null = 0;
int *p = null;
试验2,添加const;
const int null = 0;
int *p = null;
(我根据第4.11.2章其他隐式转换中的措辞进行了此试验:“常量整数值为0,文字nullptr可以转换为任何指针类型;”)
提前谢谢你。 (原因被问为一个新问题:这是一个新问题,希望找到一个解决方案。还有另一个密切相关的问题,但没有提出解决方案Is this constexpr integer not a null pointer constant?)
答案 0 :(得分:4)
标准中的实际措辞(4.10 [conv.ptr] )是:
1 - 空指针常量是整数类型的整数常量表达式(5.19)prvalue,其求值为零或类型为
的空指针值std::nullptr_t
的prvalue。空指针常量可以转换为指针类型;结果是该类型[...]
null
的问题是虽然它是一个值为零的整数常量表达式,但它是一个左值(也就是说,它是对象的名称)所以不 prvalue 。
获取整数常量prvalue的一些方法:
constexpr int null = 0;
int *p = +null;
通过在null
前加上一元算术运算符+
,我们得到 prvalue 。
const int null = 0;
int *p = static_cast<int>(null);
static_cast
到非参考类型会产生 prvalue 。
答案 1 :(得分:1)
以下代码是否合法?如果没有,你怎么能让它合法?
没有。这不合法。由于null
为int
,因此需要&
来初始化p
。
int null = 0,
int *p = &null;
否则你的编译器应该发出警告:
warning: invalid conversion from 'int' to 'int*'
如果您想初始化p
以解决0
,您可以这样做
int null = 0, *p = 0;
现在它完全合法,因为可以使用0
代替NULL
。
在C ++中,
NULL
的定义是0
,所以只有美学差异。我更喜欢避免使用宏,因此我使用0
。NULL
的另一个问题是人们有时会错误地认为它与0
和/或不是整数不同。在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免。这些日子不太常见。如果必须命名空指针,请将其命名为
nullptr
;这就是它在C ++ 11中所称的内容。然后,&#34;nullptr
&#34;将是一个关键字。