首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化初始化器列表中的恒定大小数组

初始化初始化器列表中的恒定大小数组
EN

Stack Overflow用户
提问于 2012-08-07 06:52:59
回答 3查看 71.4K关注 0票数 26

我有一个可以总结为以下情况的情况:

代码语言:javascript
复制
class Test
{

    Test();

    int MySet[10];

};

可以在初始化器列表中初始化MySet吗?

就像这样的初始化器列表:

代码语言:javascript
复制
Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-07 07:01:00

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

代码语言:javascript
复制
struct Test {
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { };
    int set[10];
};

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

正如下面一位乐于助人的用户在评论中指出的那样,此代码不能使用微软的VC++编译器cl编译。也许有人可以告诉我,使用std::array的等价物是否可以?

代码语言:javascript
复制
#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也可以很好地进行编译。

票数 28
EN

Stack Overflow用户

发布于 2012-08-07 07:00:51

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-08-07 07:07:33

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

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

您仍然可以在构造函数的初始化器列表中对其进行初始化。

对于不支持C++11大括号初始化的编译器(想到的是Visual C++版本11和更早的版本),您必须跳过一些限制,如下所示:

代码语言:javascript
复制
#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也支持这两种方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11837078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档