在初始化列表中初始化一个常量大小的数组

时间:2012-08-06 22:52:59

标签: c++ arrays class constants initializer-list

我的情况可以归纳如下:

class Test
{

    Test();

    int MySet[10];

};

是否可以在初始化列表中初始化MySet

像这种初始化列表一样:

Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}

有没有办法在类的初始化列表中初始化一个常量大小的成员数组?

3 个答案:

答案 0 :(得分:26)

虽然在C ++ 03中不可用,但C ++ 11引入了扩展初始化列表。如果使用符合C ++ 11标准的编译器,您确实可以这样做。

struct Test {
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { };
    int set[10];
};

上面的代码使用g++ -std=c++0x -c test.cc编译好。


正如我在评论中由一位乐于助人的用户所指出的,这段代码无法使用Microsoft的VC ++编译器编译。也许有人可以告诉我使用std::array的等价物是否会?

#include <array>

struct Test {
  Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { };
  std::array<int, 10> set;
};

使用g++ -std=c++0x -c test.cc编译也可以。

答案 1 :(得分:4)

不幸的是,在C ++ 03中,您无法在初始化列表中初始化数组。如果您的编译器更新,您可以在C ++ 11中使用:)

请参阅:How do I initialize a member array with an initializer_list?

答案 2 :(得分:3)

  

“我知道Set只是一个指向10个整数的静态数组的指针”

不,那是错的:它是一个数组,而不是一个指针。

您仍然可以在构造函数的初始化列表中初始化它。

对于不支持C ++ 11花括号初始化的编译器(想到Visual C ++版本11及更早版本),您将不得不跳过一些环节,如下所示:

#include <iostream>
#include <vector>
using namespace std;

#define CPP11
#if defined( _MSC_VER )
#   if (_MSC_VER <= 1700)
#       undef CPP11
#   endif
#endif

#ifdef CPP11
class Cpp11
{
private:
    int set_[10];

public:
    Cpp11()
        : set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
    {}

    int foo() const { return set_[3]; }
};
#endif

class Cpp03
{
private:
    struct IntArray10 { int values[10]; };
    IntArray10 set_;

    static IntArray10 const& oneToTen()
    {
        static IntArray10 const values =
            { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };
        return values;
    }

public:
    Cpp03()
        : set_( oneToTen() )
    {}

    int foo() const { return set_.values[3]; }
};

int main()
{}

不使用原始数组,而是使用std::vector和C ++ + 11 std::array,即使Visual C ++ 11也支持这两种数据。