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

Posted

技术标签:

【中文标题】在初始化列表中初始化一个常量大小的数组【英文标题】:Initialize a constant sized array in an initializer list 【发布时间】:2012-08-03 22:38:26 【问题描述】:

我的情况可以总结如下:

class Test


    Test();

    int MySet[10];

;

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

像这种初始化列表:

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

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

【问题讨论】:

不管怎样,Set 不仅仅是指向10 整数数组的指针,这里也不是static。相反,在某些情况下,数组名称Set 衰减为指向数组第一个元素的指针。使用sizeof 可以清楚地看到差异 - 即sizeof(Set) == 10 * sizeof(int) != sizeof(int*) @StuartGolodetz 感谢您的澄清。当我说静态时,我的意思是静态形式,它与对象/实例一起存储,而不仅仅是堆中的其他地方。当然,就我而言,这是对static 一词的严重滥用。对不起。 不用担心 :) 我主要是想澄清数组和指针之间的区别,以防万一出现误解。 【参考方案1】:

虽然在 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编译得很好。


正如 cmets 中一位乐于助人的用户在我下面指出的那样,此代码无法使用 Microsoft 的 VC++ 编译器 cl. 编译。也许有人可以告诉我使用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 也可以正常编译。

【讨论】:

爱 C++11(或它的某些部分)的另一个好理由! =D 非常感谢! 请注意,此代码不能与 Visual C++ 11 及更早版本一起编译(即,它不能与 Microsoft Visual Studio 2012 一起编译,而 Visual C++ 是最常见平台的主要编译器)。因此,如果您想要可移植的代码,请不要这样做。然而。 谢谢@Cheersandhth.-Alf,因为我不是 C++ 程序员,也不知道这一点。 :) @Serge 你应该确保你听从上面的建议,以防你想要可移植的代码。考虑使用 std::array&lt;int, 10&gt; 作为替代方案,希望它也适用于 Visual C++ 11。【参考方案2】:

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

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

【讨论】:

甚至 C++98 也支持初始化列表中数组的零初始化。【参考方案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 也支持这两者。

【讨论】:

以上是关于在初始化列表中初始化一个常量大小的数组的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数的初始化列表中初始化数组

C# 与 C++ 静态数组中静态常量列表初始化的效率

Go语言中复合的数据类型

8. 第 8 章 数组

C++ - 尽管有括号列表初始化,但不能“新建”未知大小的数组?

C++_const 常量成员以及成员初始化列表及其常量类