如何初始化没有默认构造函数的成员std :: array对象?

时间:2011-12-27 15:42:44

标签: c++ c++11

以下是我遇到问题的代码:

class Foo {
public:
    Foo() :
        memberArray{Bar(1), Bar(3), Bar(2)}
    {}
    struct Bar {
        Bar(int param1) {  }
    };
private:
    std::array<Bar,3> memberArray;
//  Bar memberArray[3];    // Using a raw array like this instead compiles fine..
};

我正在使用GCC 4.6.1,并为c ++ 11编译。我应该如何初始化我的std :: array?

4 个答案:

答案 0 :(得分:5)

由于array<T, N>实际上是一个结构,因此完全支撑的版本需要{{ .. }}(内部版本用于array<T, N>对象的数组成员)。该规范不允许在此处使用大括号。它只允许声明

形式
Type var = { ... };

所以你必须使用完全支撑的语法

Foo() :
    memberArray{{Bar(1), Bar(3), Bar(2)}}
{}

这不是GCC错误,但是规范要求。

答案 1 :(得分:2)

作为一种变通方法,您可以让函数返回此数组的实例。

#include <array>

class Foo {
public:
    Foo() :
        memberArray(makeMemberArray())
    {}
    struct Bar {
        Bar(int param1) {  }
    };
private:
    std::array<Bar,3> memberArray;
//  Bar memberArray[3];    // Using a raw array like this instead compiles fine..

    static std::array<Bar, 3> makeMemberArray() { 
      std::array<Bar,3> a = {Bar(1), Bar(2), Bar(3)}; 
      return a; 
    }
};

我认为统一初始化应该允许你正在做的事情,除非它可能没有被编译器实现。

答案 2 :(得分:0)

以Johannes Schaub为基础 - litb的回答......至少GCC会允许你使用缩写语法(省略,无意义的类名):

Foo() :
    memberArray{{ {1}, {3}, {2} }}
{}

而不是

Foo() :
    memberArray{{Bar(1), Bar(3), Bar(2)}}
{}

我个人在初始化多态指针数组时只使用第二个版本:

Foo() :
    memberArray{{
        dynamic_cast<Bar*>(new BarA(1)),
        dynamic_cast<Bar*>(new BarB(3)),
        dynamic_cast<Bar*>(new BarC(2))
    }}
{}

答案 3 :(得分:-5)

试试这个(适用于g ++ 4.5.2):

  Foo() :
      memberArray (std::array<Bar,3> {Bar(1), Bar(3), Bar(2)})
  {}