首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >混合常量表达式声明和常量定义

混合常量表达式声明和常量定义
EN

Stack Overflow用户
提问于 2015-10-10 20:07:46
回答 1查看 509关注 0票数 18

我遇到了以下情况:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
‘constexpr’ needed for in-class initialization of static data member ‘const char Foo::s [12]’ of non-integral type [-fpermissive]

我发现this old question似乎讨论了混合constexprconst,但它关注的是初始化器是否是常量表达式,而不是定义和声明在常量方面是否可以不同。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-10 20:19:04

你的代码是格式良好的。constexpr-specifier本身不是该类型的一部分,但添加了const (dcl.constexpr/9),它出现在您的第二个声明中。尽管一个函数(或函数模板)的不同声明在constexpr-ness中必须按照dcl.constexpr/1一致,但变量声明不存在这样的规则。

请参阅bug ,它基本上使用了您的示例。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33053799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档