混合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]
我发现了这个老问题,似乎是在讨论混合constexpr
和const
,但它关注的是初始化式是否为常量表达式,而不是定义和声明是否可以在constness方面有所不同。
是否允许将constexpr T
静态数据成员定义为const T
?
您的代码格式良好。constexpr
-说明符本身不是类型的一部分,但添加了const
([dcl.constexpr]/9),它存在于第二个声明中。虽然一个函数(或函数模板)的不同声明必须按照[dcl]的constexpr
-ness一致。对于变量声明,不存在这样的规则。
见bug #58541,它基本上使用了你的例子。
相关文章:
- 在运算符重载定义中使用成员函数(const错误)
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何定义在编译时数据未知的 const 数组
- 具体来说,标准在哪里规定修改 const 对象是未定义的行为?
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何键入用于const对象的自定义io操纵器
- 正在通过const-ref未定义的行为捕获新构造的对象
- 自定义链表const_iterator无法遍历列表的非const实例
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 如何检查函数是否真的获得了定义为 const 的变量?
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- 为什么相同的函数签名只有区别,另一个通过 const 获取参数是重新定义?
- 明确定义'static const variable in a struct'对C++ 11 及以上有什么影响吗?
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用
- 如果我返回const定义的对象,为什么const关键字被取消资格
- 混合constexpr声明和const定义
- 只读内存映射寄存器在C中使用' volatile const '定义,但在c++中仅使用' volatile '