Initialize a constant sized array in an initializer list

前端 未结 3 617
心在旅途
心在旅途 2021-02-05 05:00

I\'ve got a situation which can be summarized in the following:

class Test
{

    Test();

    int MySet[10];

};

is it possible to initialize

相关标签:
3条回答
  • 2021-02-05 05:17

    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?

    0 讨论(0)
  • 2021-02-05 05:34

    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.

    0 讨论(0)
  • 2021-02-05 05:35

    "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 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()
    {}
    

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

    0 讨论(0)
提交回复
热议问题