混合constexpr声明和const定义

Ker*_* SB 18 c++ static-members c++11

我遇到了以下情况:

struct Foo
{
    static constexpr char s[] = "Hello world";
};

const char Foo::s[];
Run Code Online (Sandbox Code Playgroud)

这段代码片段与Clang 3.7编译(带-std=c++11-std=c++14),但GCC(4.8,6.0,相同的语言设置)给出了我预期的错误:

GCC 4.8:

in.cpp:6:19: error: redeclaration ‘Foo::s’ differs in ‘constexpr’
 const char Foo::s[];
                   ^
in.cpp:3:27: error: from previous declaration ‘Foo::s’
     static constexpr char s[] = "Hello world";
                           ^
in.cpp:6:19: error: declaration of ‘constexpr const char Foo::s [12]’ outside of class is not definition [-fpermissive]
 const char Foo::s[];
Run Code Online (Sandbox Code Playgroud)

GCC 6.0:

‘constexpr’ needed for in-class initialization of static data member ‘const char Foo::s [12]’ of non-integral type [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

我发现这个老问题似乎在讨论混合constexprconst,但是,它专注于初始化是否是常量表达式,而在定义和声明是否可以针对不同的常量性.

是否允许将constexpr T静态数据成员的定义提供为const T

Col*_*mbo 13

您的代码格式正确.该constexpr-specifier本身不是类型的一部分,但增加了const([dcl.constexpr]/9),其存在于第二个声明.虽然constexpr根据[dcl.constexpr]/1,一个函数(或函数模板)的不同声明必须在-ness中达成一致,但变量声明不存在这样的规则.

请参阅错误#58541,它基本上使用了您的示例.