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)
这对我来说似乎未指定,我没有看到明确的要求,但我们可以从缺陷报告 699 中看出为什么这是一个问题:必须在类成员规范中定义 constexpr 成员函数吗?尽管处理 constexpr 成员函数,但它表示以下内容(重点是我的):
\n\n\n\n\n如果放宽限制以允许单独声明和定义 constexpr 成员函数,则需要回答一些问题,例如 constexpr 说明符是否必须出现在声明和定义上(内联说明符不需要) 。如果它可以在其中一个或另一个中被省略,则存在关于 constexpr 暗示 const 这一事实的可用性问题;需要在省略 constexpr 的声明中显式指定 const 限定符。
\n
尽管在这种情况下添加const并不能解决问题,但在更简单的情况下它似乎确实解决了问题。我们可以在更简单的情况下看到 clang 和 gcc 都需要 const 或 constexpr:
struct T\n{\n static constexpr int blah = 1 ;\n};\n\nconst int T::blah ;\nRun 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\n\n没有规则要求变量的连续声明在“constexpr”性方面一致(该规则仅适用于函数)。
\n
所以这看起来像是一个 gcc 错误,尽管它看起来仍然可以在标准中使用一些清晰度。
\n