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

时间:2014-06-13 20:11:44

标签: c++ c++11 constexpr

在“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?

2 个答案:

答案 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)

  

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

没有。这不合法。由于nullint,因此需要&来初始化p

int null = 0, 
int *p = &null;   

否则你的编译器应该发出警告:

warning: invalid conversion from 'int' to 'int*'

如果您想初始化p以解决0,您可以这样做

int null = 0, *p = 0;  

现在它完全合法,因为可以使用0代替NULL

c++-faq

  

在C ++中,NULL的定义是0,所以只有美学差异。我更喜欢避免使用宏,因此我使用0NULL的另一个问题是人们有时会错误地认为它与0和/或不是整数不同。在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免。这些日子不太常见。

     

如果必须命名空指针,请将其命名为nullptr;这就是它在C ++ 11中所称的内容。然后,&#34; nullptr&#34;将是一个关键字。