Initialize a constant sized array in an initializer list Initialize a constant sized array in an initializer list arrays arrays

Initialize a constant sized array in an initializer list


While not available in C++03, C++11 introduces extended initializer lists. You can indeed do it if using a compiler compliant with the C++11 standard.

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

The above code compiles fine using g++ -std=c++0x -c test.cc.


As pointed out below me by a helpful user in the comments, this code does not compile using Microsoft's VC++ compiler, cl. Perhaps someone can tell me if the equivalent using std::array will?

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

This also compiles fine using g++ -std=c++0x -c test.cc.


Unfortunately, in C++03, you cannot initialize arrays in initializer lists. You can in C++11 though if your compiler is newer :)

see: How do I initialize a member array with an initializer_list?


"I understand that Set is just a pointer to the static array of 10 integers"

No, that's wrong: it's an array, not a pointer.

You can still initialize it in the constructor's initializer list.

For a compiler that doesn't support C++11 curly braces initialization (Visual C++ version 11 and earlier comes to mind) you'll have to jump through some hoops though, as shown below:

#include <iostream>#include <vector>using namespace std;#define CPP11#if defined( _MSC_VER )#   if (_MSC_VER <= 1700)#       undef CPP11#   endif#endif#ifdef CPP11class Cpp11{private:    int set_[10];public:    Cpp11()        : set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }    {}    int foo() const { return set_[3]; }};#endifclass 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(){}

Instead of using raw arrays, though, use std::vector and C+++11 std::array, both of which are supported even by Visual C++ 11.