Initialize a constant sized array in an initializer list

▼魔方 西西 提交于 2019-12-04 15:35:13

问题


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

class Test
{

    Test();

    int MySet[10];

};

is it possible to initialize MySet in an initializer list?

Like this kind of initializer list:

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

Is there any way to initialize a constant-sized member array in a class's initalizer list?


回答1:


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.




回答2:


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?




回答3:


"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.



来源:https://stackoverflow.com/questions/11837078/initialize-a-constant-sized-array-in-an-initializer-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!