class元素数组作为静态constexpr成员

时间:2014-03-04 17:07:28

标签: c++ arrays class c++11 constexpr

我有一个类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;

有办法解决这个问题吗?或者解决方法?

3 个答案:

答案 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)

我找到了以下确保

的解决方案
  1. 数组在编译时计算
  2. 数组存储在结构中而不进行复制。
  3. 这个想法是在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}}}; 被定义为实际的常量表达式。

Live Demo

归功于理查德史密斯this answer