【问题标题】:How can I initialize a POD array using parenthesis syntax in C++?如何在 C++ 中使用括号语法初始化 POD 数组?
【发布时间】:2013-06-27 04:31:58
【问题描述】:

到目前为止,我只看到了 C++ 中 POD 数组的赋值初始化。例如,

int array[]={1,2,3};

here 我了解到,当数组位于 C++11 的类/结构中时,可以使用初始化列表方法来初始化数组。但我试图将数组定义为:

int array[]({1,2,3});

编译时出错:

array initializer must be an initializer list

我认为它只需要一些修改,但我就是想不通。你能告诉我如何实现它吗?

顺便说一句,复制构造函数比这里的赋值更有效吗?我猜不是,但我不知道确切的答案。

【问题讨论】:

  • 括号看起来像这样:()。我想你的意思是braces{}(又名大括号)。
  • @MarceloCantos 我的意思是(),我在想int a(10);这样的形式。

标签: c++ c++11


【解决方案1】:

POD 数组不能使用类似构造函数(括号)的语法进行初始化。如果要以统一的方式初始化变量,请使用初始化列表(大括号)语法来初始化变量。例如,以下代码将使用 gcc 4.7.3 进行编译:

struct Foo
{
    Foo(int a, std::string s);
}

int main()
{
    // can also use parentheses on the next two lines
    int a{3};
    Foo f{a, "A string"};

    // only curly braces can be used here
    int arr[]{4, 5, 6};

    return 0;
}

花括号语法还允许您使用 std::initializer_list 以与数组相同的方式构造向量和其他 STL 类型,这只能使用如下括号:

std::vector<int> v{1, 2, 3, 4, 5};

// contrast with

std::initializer_list<int> i{1, 2, 3, 4, 5}; // must use curly braces here
std::vector<int> v(i);

【讨论】:

  • 但是您的示例没有显示差异,大括号仍然可以在此处替换为括号。另外,没有数组初始化。
  • 我编辑了帖子以显示数组初始化。除了 @AndyProwl 在 cmets 中对他的回答简要提到的例外情况外,花括号初始化等效于使用括号调用构造函数。
  • 知道了,谢谢(其实我对这种形式很熟悉,但从来没想过这里的大括号)。那么={} 的效率在这里是一样的吗?也许我应该尝试查看生成的程序集。
  • 是的,两种形式的区别仅在于语法;应该不会影响性能。
【解决方案2】:

不确定我是否正确理解了您的问题的上下文,但这是您在构造函数的初始化列表中初始化数组的方式:

struct X
{
    X() : arr{1, 2, 3} { }
//        ^^^^^^^^^^^^
private:
    int arr[3];
};

【讨论】:

  • 请注意,这是 C++11 语法。在 C++98 中,您不能初始化数组成员。
  • @peppe:对,但问题被标记为 C++11
  • @peppe 你可以:: arr() 是的,我知道你不是这个意思。 :)
  • 我很好奇数组是否可以像int a(2);这样的基本类型一样初始化,以便统一初始化的形式。
  • @HongxuChen:反之亦然,你可以用大括号初始化其他类型,如:X() : a{42}, arr{1, 2, 3}, Y{2} { ... }
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多