繁体   English   中英

混合constexpr声明和const定义

[英]Mixing constexpr declarations and const definitions

我遇到了以下情况:

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 ,但它关注的是初始化器是否是常量表达式,而不是定义和声明是否可以在const方面有所不同。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM