我有一个类Bar
的constexpr静态成员的引导问题
这是Bar
本身的数组。请考虑以下完全正确的代码:
struct Foo {
int i;
static const std::array<Foo, 2> A;
};
const std::array<Foo, 2> Foo::A {{{1},{2}}};
现在我想Foo::A
不仅是const,还有constexpr
。我面对了
有问题,必须完成静态constexpr成员初始化
里面类声明。但是,由于声明尚未完成,
编译器还不知道实例的大小,因此拒绝
制作阵列。例如
struct Bar {
int i;
constexpr static const std::array<Bar, 2> A{{{1},{2}}};
};
被拒绝
/usr/include/c++/4.8/array: In instantiation of ‘struct std::array<Bar, 2ul>’:
ess.cpp:14:56: required from here
/usr/include/c++/4.8/array:97:56: error: ‘std::array<_Tp, _Nm>::_M_elems’ has incomplete type
typename _AT_Type::_Type _M_elems;
有办法解决这个问题吗?或者解决方法?
答案 0 :(得分:2)
目前这是不可能的,编译器无法事先知道constexpr
是否实际允许/可能。用一个函数替换成员A,它应该工作:
struct Bar
{
int i;
constexpr static std::array<Bar, 2> get_A()
{
return {{{1}, {2}}};
}
};
相关(几乎重复):static constexpr member of same type as class being defined
答案 1 :(得分:0)
我找到了以下确保
的解决方案这个想法是在constexpr数组上使用const引用。
struct Bar {
int i;
static const std::array<Bar, 2> &A;
};
constexpr const std::array<Bar, 2> BarA {{{1},{2}}};
const std::array<Bar, 2> &Bar::A = BarA;
答案 2 :(得分:0)
解决方案实际上只是在定义上包含openssl_get_cert_locations
关键字,但不 声明:
constexpr
这确保struct Foo {
int i;
static const std::array<Foo, 2> A;
};
constexpr std::array<Foo, 2> Foo::A {{{1},{2}}};
被定义为实际的常量表达式。
归功于理查德史密斯this answer。