【发布时间】:2015-10-10 12:07:45
【问题描述】:
我遇到了以下情况:
struct Foo
{
static constexpr char s[] = "Hello world";
};
const char Foo::s[];
此代码 sn-p 使用 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]
我发现this old question 似乎在讨论混合constexpr 和const,但它关注的是初始化程序是否是常量表达式,而不是定义和声明在常量方面是否可以不同。
是否允许将constexpr T 静态数据成员定义为const T?
【问题讨论】:
-
@ShafikYaghmour:谢谢,很有趣。似乎 GCC 错误消息变得更加混乱。在 4.8 中它是一致的,虽然它与标准相矛盾,但新的错误消息相当模糊。
标签: c++ c++11 static-members