gpt4 book ai didi

c++ - 这个 constexpr 整数不是空指针常量吗?

转载 作者:可可西里 更新时间:2023-11-01 17:46:06 26 4
gpt4 key购买 nike

考虑以下 C++11 程序及其在 GCC 4.7.2 中的结果:

int main()
{
constexpr int i = 0;
int* p = i;
}

// g++ -g -ggdb -Wall -Wextra -pedantic -std=c++11 t.cpp
// t.cpp: In function 'int main()':
// t.cpp:4:13: error: invalid conversion from 'int' to 'int*' [-fpermissive]
// t.cpp:4:9: warning: unused variable 'p' [-Wunused-variable]

根据标准:

[C++11: 4.10/1]: A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to zero [..]

5.19 是一团糟,我没能完全解析它,但我们不会期望 i 满足这个标准并充当一个空指针常量,因此不需要显式转换为 int* 来初始化 p?

如果我使用 s/constexpr/const/ 并使用 -ansi 而不是 -std=c++11 进行编译,编译就会成功。

最佳答案

[C++11: 5.19/3]: A literal constant expression is a prvalue core constant expression of literal type, but not pointer type. An integral constant expression is a literal constant expression of integral or unscoped enumeration type. [..]

和:

[C++11: 3.9/10]: A type is a literal type if it is:

  • a scalar type; or
  • a reference type; or
  • a class type (Clause 9) that has all of the following properties: [..]
  • an array of literal type.

此时,我找不到该代码不兼容的原因,所以我怀疑是 GCC 错误。

然而,鉴于建议更改您从 4.10 中引用的段落 (active issue #903),因此这实际上是不兼容的代码,这可能是一个故意的错误。


The compilation succeeds if I s/constexpr/const/ and compile with -ansi rather than -std=c++11.

整型常量表达式的定义在 C++03 中明确允许这种情况:

[C++03: 5.19/1]: [..] An integral constant-expression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions (8.5), non-type template parameters of integral or enumeration types, and sizeof expressions. [..]

关于c++ - 这个 constexpr 整数不是空指针常量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13493353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com