混合 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,相同的语言设置)给出了我预期的错误:
海湾合作委员会 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[];
海湾合作委员会 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
?
您的代码格式正确。 constexpr
-说明符本身不是类型的一部分,而是添加了 const
([dcl.constexpr]/9),它出现在您的第二个声明中。尽管根据 [dcl.constexpr]/1,一个函数(或函数模板)的不同声明必须在 constexpr
-ness 中达成一致,但对于变量声明不存在这样的规则。
查看错误 #58541,它基本上使用了您的示例。
我遇到过以下情况:
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,相同的语言设置)给出了我预期的错误:
海湾合作委员会 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[];
海湾合作委员会 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
?
您的代码格式正确。 constexpr
-说明符本身不是类型的一部分,而是添加了 const
([dcl.constexpr]/9),它出现在您的第二个声明中。尽管根据 [dcl.constexpr]/1,一个函数(或函数模板)的不同声明必须在 constexpr
-ness 中达成一致,但对于变量声明不存在这样的规则。
查看错误 #58541,它基本上使用了您的示例。