gpt4 book ai didi

c++ - 不完整类型的嵌套静态 constexpr。 C++ 是否有效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:10 25 4
gpt4 key购买 nike

Clang 和 GCC 在以下代码是否有效 C++11 上存在分歧:

struct Thing {
int value;
static const Thing thing;
};

constexpr Thing Thing::thing {3};

Clang 编译它并且 GNU GCC version 4.7.2 说:
错误:重新声明“Thing::thing”在“constexpr”中不同
constexpr Thing Thing::thing {3};

哪个编译器对标准的解释是正确的? C++14 标准似乎要对此事发表一些新的看法吗?

最佳答案

简介

该代码段在 C++11 中是合法的,并且在 C++14 中没有任何变化。

Note: gcc 4.9.0 correctly accepts the snippet, ie. rejecting the snippet was a bug in previous versions of the compiler.


说明

constexpr 说明符肯定会影响被定义的对象(它将被声明为 const),但特别是说明符强制声明的对象;

  • 文字类型,并且;
  • 有一个初始化器,并且;
  • 初始化器是一个常量表达式

struct Thing {
int value;
static const Thing thing; // (A)
};

constexpr Thing Thing::thing {3}; // (B)

这意味着定义 (B) 引用了一个名为 thingThing const 类型的对象,它与 (A) 相同,因此;该代码段是合法的。


7.1.5p9 The constexpr specifier [dcl.constexpr] (n3337)

A constexpr specifier used in an object declaration declares the object as const. Such an object shall have literal type and shall be initialized.

关于c++ - 不完整类型的嵌套静态 constexpr。 C++ 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24342455/

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