繁体   English   中英

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

[英]array of class element as a static constexpr member

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

有办法解决这个问题吗? 还是一个解决方法?

目前这是不可能的,编译器无法事先知道constexpr是否实际允许/可能。 用一个函数替换成员A,它应该工作:

struct Bar
{
    int i;
    constexpr static std::array<Bar, 2> get_A()
    {
        return {{{1}, {2}}};
    }
};

相关(几乎重复): 与定义的类相同类型的静态constexpr成员

我找到了以下解决方案,以确保这一点

  1. 该数组在编译时计算
  2. 数组存储在结构中而不进行复制。

想法是在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;

解决方案实际上只是在定义中包含constexpr关键字,而不是 声明

struct Foo {
  int i;
  static const std::array<Foo, 2> A;
};
constexpr std::array<Foo, 2> Foo::A {{{1},{2}}};

这确保了Foo::A被定义为实际的常量表达式。

现场演示

感谢理查德史密斯的回答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM