为什么GCC认为constexpr静态数据成员的定义必须标记为constexpr?

Lig*_*ica 24 c++ gcc constexpr c++14

[C++14: 7.1.5/1]:constexpr说明符将只应用于一个变量或变量模板,功能或功能模板的声明,或文字类型(3.9)的静态数据成员的声明中的定义.如果函数,函数模板或变量模板的任何声明都有一个constexpr说明符,那么它的所有声明都应该包含说明constexpr符.[..]

请注意,第二句没有像第一句话那样提及"静态数据成员",因此本段中没有要求数据成员的所有声明(此处我正在考虑具体的定义声明)constexpr static具有constexpr符.

我也无法在其他地方找到规则.

那么,为什么海湾合作委员会会拒绝以下计划呢?

#include <chrono>

using namespace std::chrono_literals;

#define DUR 1000ms

struct T
{
   static constexpr auto dur_1 = DUR;
};

decltype(T::dur_1) T::dur_1;

// main.cpp:12:23: error: 'constexpr' needed for in-class initialization of static data member 'const std::chrono::duration<long int, std::ratio<1l, 1000l> T::dur_1' of non-integral type [-fpermissive] 
// decltype(T::dur_1) T::dur_1;
//                       ^
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 2

这对我来说似乎未指定,我没有看到明确的要求,但我们可以从缺陷报告 699 中看出为什么这是一个问题:必须在类成员规范中定义 constexpr 成员函数吗?尽管处理 constexpr 成员函数,但它表示以下内容(重点是我的):

\n\n
\n

如果放宽限制以允许单独声明和定义 constexpr 成员函数,则需要回答一些问题,例如 constexpr 说明符是否必须出现在声明和定义上(内联说明符不需要) 。如果它可以在其中一个或另一个中被省略,则存在关于 constexpr 暗示 const 这一事实的可用性问题;需要在省略 constexpr 的声明中显式指定 const 限定符。

\n
\n\n

尽管在这种情况下添加const并不能解决问题,但在更简单的情况下它似乎确实解决了问题。我们可以在更简单的情况下看到 clang 和 gcc 都需要 const 或 constexpr:

\n\n
struct T\n{\n   static constexpr int blah = 1 ;\n};\n\nconst int T::blah ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

这个 gcc 错误报告:Bogus "error: redeclaration ... Differences in \xe2\x80\x98constexpr\xe2\x80\x99"引用了 Richard Smith 的以下内容:

\n\n
\n

没有规则要求变量的连续声明在“constexpr”性方面一致(该规则仅适用于函数)。

\n
\n\n

所以这看起来像是一个 gcc 错误,尽管它看起来仍然可以在标准中使用一些清晰度。

\n