混合constexpr声明和const定义

Mixing constexpr declarations and const definitions

本文关键字:const 定义 声明 constexpr 混合      更新时间:2023-10-16

我遇到了以下情况:

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

这个代码片段可以在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[];

GCC 6.0:

‘constexpr’ needed for in-class initialization of static data member ‘const char Foo::s [12]’ of non-integral type [-fpermissive]

我发现了这个老问题,似乎是在讨论混合constexprconst,但它关注的是初始化式是否为常量表达式,而不是定义和声明是否可以在constness方面有所不同。

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

您的代码格式良好。constexpr -说明符本身不是类型的一部分,但添加了const ([dcl.constexpr]/9),它存在于第二个声明中。虽然一个函数(或函数模板)的不同声明必须按照[dcl]的constexpr -ness一致。对于变量声明,不存在这样的规则。

见bug #58541,它基本上使用了你的例子。

相关文章: