在gcc 4.8中初始化静态constexpr成员数组
Initialization of static constexpr member array in gcc 4.8
当使用-std=c++11:时,以下代码在gcc 4.9.1和clang-3.6中编译并运行
struct Bar
{
int x;
};
struct Foo
{
static constexpr Bar bars[] = {1, 2, 3};
};
constexpr Bar Foo::bars[];
然而,它在gcc 4.8.3中失败,导致错误消息
./cpptest.cpp:14:43: error: could not convert '1' from 'int' to 'const Bar'
static constexpr Bar bars[] = {1, 2, 3};
^
./cpptest.cpp:14:43: error: could not convert '2' from 'int' to 'const Bar'
./cpptest.cpp:14:43: error: could not convert '3' from 'int' to 'const Bar'
顺便说一句,如果我做同样的事情,但使bars
成为一个静态常量全局数组,那么它在gcc 4.8和clang中编译得很好。如果我用一对额外的{}
包围列表中的每个整数文字,它也会编译得很好。
那么这是gcc 4.8中的一个错误吗?标准规定了什么是合适的语法?当我省略额外的大括号时,调用的是c++11统一初始化标准的哪一部分?
编辑:看起来标准规定这应该调用聚合初始化,这应该允许"大括号省略"。因此,这似乎是gcc 4.8中的一个错误,由gcc 4.9修复,但我对我对标准的阅读完全没有信心。我在gcc的bug跟踪器中似乎也找不到任何关于这方面的bug报告,所以我很容易出错。
为了完成您想要做的事情,您需要在Foo:中指定一个constexpr构造函数
struct Bar
{
constexpr Bar(int c) : x(c)
{}
int x;
};
struct Foo
{
static constexpr Bar bars[] = {1, 2, 3};
};
constexpr Bar Foo::bars[];
显然,gcc 4.8.3并没有将花括号内的值隐式转换为Bar对象,而gcc 4.9.1则实现了。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 类内部和外部静态 constexpr 元组之间的差异
- 静态 constexpr 类成员变量对多线程读取是否安全?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- constexpr函数中的静态constexpr变量
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- C++访问静态 constexpr 数组
- 初始化模板化类中的静态 constexpr 成员
- 静态 constexpr 成员变量初始化
- 是否使用静态 constexpr 变量 odr?
- 静态 constexpr 全局变量
- 使用静态 constexpr 成员的未解析外部符号
- 在模板定义中调用非静态constexpr成员函数
- 类本身内部的类对象的静态constexpr数组
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- 类中的静态 constexpr 初始化链
- 静态 constexpr 的编译器优化
- 无法声明静态 constexpr char []
- 为什么 clang 并不总是为相同的静态 constexpr 产生常量值
- emplace_back会导致静态 constexpr 成员上出现链接错误