【问题标题】:std::array implicit initialization in function call [duplicate]函数调用中的 std::array 隐式初始化
【发布时间】:2013-01-07 06:20:47
【问题描述】:

可能重复:
When can outer braces be omitted in an initializer list?

我在 Visual Studio 2010 中使用 std::array,实际上是 std::tr1::array,我遇到了一个烦人的问题。例如,我有一个以array 作为参数的函数。

void do_something(std::tr1::array<int, 5> data)

调用像do_something({1,2,3}); 这样的函数不起作用并导致编译器错误,但是

std::tr1::array<int, 5> data = {1,2,3};
do_something(data);

确实如此。我真的不明白为什么前者不起作用。我得到的错误告诉我我在{ 之前缺少)。这让我相信它不需要初始化列表,但我不明白为什么不这样做。我是否滥用了初始化列表?

编辑:std::tr1::array 不是必需的,std::array 工作正常..

【问题讨论】:

    标签: c++ c++11 initializer-list


    【解决方案1】:

    试试这个

    do_something({{1,2,3}});
    

    std::array 使用 2 组大括号进行初始化,但在某些情况下(例如您发布的示例),您可以省略外部虚假大括号。这可能会有所帮助:C++11: Correct std::array initialization?

    【讨论】:

    • 这里相同,编译器相同..
    • 它适用于我的 GCC:stacked-crooked.com/view?id=0db4e5670d751282ca5cd244708bd38a 我想 MSVC 不完全支持大括号初始化。
    • 是的,OP提到了VS2010,我猜目前还不支持
    • 是的,看起来VS2010不支持它,我只是假设它会因为它在函数调用之外。哦,好吧!
    【解决方案2】:

    需要额外的大括号,因为std::array 是一个聚合和 POD,与标准库中的其他容器不同。 std::array 没有用户定义的构造函数。它的第一个数据成员是一个大小为N 的数组(您将其作为模板参数传递),并且该成员直接使用初始化程序进行初始化。直接初始化的 internal 数组需要额外的大括号。

    可以这样想:

    struct A
    {
         int data[2];
    };
    

    创建A 的实例时需要多少个大括号?

    A a{1,2};      //wrong as per the Standard (the compiler might allow it)
    A b{ {1,2 } }; //correct
    

    b 中,{} 的外部对用于 struct{} 的内部对用于成员数组

    希望对您有所帮助。

    【讨论】:

    • 这是有道理的,但显然不是我的编译器!猜猜它在 VS2010 中不完全支持。
    • @user1520427:编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2015-10-05
    • 2015-09-04
    • 1970-01-01
    • 2012-02-10
    • 2014-03-31
    • 2016-02-16
    • 2021-03-19
    相关资源
    最近更新 更多