我在书中看到了一个例外,但我无法弄清楚答案:
以下代码是否合法?如果没有,你怎么能让它合法?
int null = 0, *p = null;
当然,第二个不合法,你不能将int转换为int*.
主题是在该部分constexpr.
伙计们!这只是一个关于指针,consts和constexprs的练习!我想,你必须在没有cast和nullptr的情况下解决它.
在C++ 11中,空指针常量定义为
整数类型的整数常量表达式prvalue,其值为零
(C++ 11 [conv.ptr] 4.10/1)
这意味着添加constexpr到声明实际上使null有效的空指针不变:
constexpr int null = 0, *p = null;
Run Code Online (Sandbox Code Playgroud)
请注意,这被认为是一个缺陷,并在C++ 14中进行了更改,因此只有整数文字可以是空指针常量:
甲空指针常数是文字与零值的整数...
(C++ 14 N4140 [conv.ptr] 4.10/1)
因此,有一种方法可以constexpr在C++ 11 中使初始化合法使用,但它的存在被认为是标准缺陷并在C++ 14中被删除.因此,这本书教授过时的信息.
请注意,因为这是一个缺陷,编译器通常也会将此行为反向移植到他们的C++ 11模式(如果他们甚至首先实现了原始行为).