如何在C++中使这个初始化合法化?

Aaa*_*aaa 4 c++ c++11

我在书中看到了一个例外,但我无法弄清楚答案:

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

int null = 0, *p = null;

当然,第二个不合法,你不能将int转换为int*.

主题是在该部分constexpr.

伙计们!这只是一个关于指针,consts和constexprs的练习!我想,你必须在没有cast和nullptr的情况下解决它.

Rei*_*ica 9

在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模式(如果他们甚至首先实现了原始行为).

  • @krzaq由于它被认为是C++ 11中的缺陷,因此符合标准的编译器可能会选择在C++ 11模式下应用修复. (4认同)
  • @StoryTeller完全符合编译器™它会工作:) (3认同)