在构造函数初始值设定项中初始化成员数组

Arm*_*yan 92 c++ initializer-list ctor-initializer aggregate-initialization c++11

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};
Run Code Online (Sandbox Code Playgroud)

我相信原因是数组只能用=语法初始化,即:

int arr[3] = {1,3,4};
Run Code Online (Sandbox Code Playgroud)

问题

  1. 我该怎么做我想做的事情(也就是说,在构造函数中初始化一个数组(不在主体中分配元素)).它甚至可能吗?
  2. C++ 03标准是否对在ctor初始化器中初始化聚合(包括数组)有什么特别之处?或者上述代码的无效性是其他一些规则的必然结果?
  3. C++ 0x初始化列表是否解决了这个问题?

PS请不要提及矢量,boost ::数组,以及它们对数组的优越性,我很清楚.

Joh*_*itb 53

  1. 我该怎么做我想做的事情(也就是说,在构造函数中初始化一个数组(不在主体中分配元素)).它甚至可能吗?

是.它使用的是包含数组的结构.你说你已经知道了,但后来我不明白这个问题.这样,您可以在构造函数中初始化数组,而无需在正文中进行赋值.这是做什么的boost::array.

C++ 03标准是否对在ctor初始化器中初始化聚合(包括数组)有什么特别之处?或者上述代码的无效性是其他一些规则的必然结果?

mem-initializer使用直接初始化.第8条的规则禁止这种事情.我不完全确定以下情况,但有些编译器确实允许它.

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此GCC PR.

C++ 0x初始化列表是否解决了这个问题?

是的,他们这样做.但是,我认为你的语法无效.您必须直接使用大括号来触发列表初始化

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};
Run Code Online (Sandbox Code Playgroud)


Che*_*Alf 29

除了归零(或非POD元素,值初始化)数组外,C++ 98不提供任何直接语法.为此,你只需写C(): arr() {}.

我认为Roger Pate对C++ 0x聚合初始化的所谓限制是错误的,但是我太懒了,无法查找或查看它,这没关系,是吗?编辑:罗杰在谈论"C++ 03",我把它误读为"C++ 0x".对不起,罗杰.?

当前代码的C++ 98解决方法是将数组包装在a中struct,并从该类型的静态常量初始化它.无论如何,数据必须驻留在某处.袖口可以看起来像这样:

class C 
{
public:
    C() : arr( arrData ) {}

private:
     struct Arr{ int elem[3]; };
     Arr arr;
     static Arr const arrData;
};

C::Arr const C::arrData = {{1, 2, 3}};
Run Code Online (Sandbox Code Playgroud)

  • 我的句子的前两个单词是*在C++ 03中,......* (6认同)

Ale*_*tov 7

解决方法:

template<class T, size_t N>
struct simple_array { // like std::array in C++0x
   T arr[N];
};


class C : private simple_array<int, 3> 
{
      static simple_array<int, 3> myarr() {
           simple_array<int, 3> arr = {1,2,3};
           return arr;
      }
public:
      C() : simple_array<int, 3>(myarr()) {}
};
Run Code Online (Sandbox Code Playgroud)