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整数不是空指针常量吗?)
标准 (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。
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |