C ++ 11在飞行结构上不一致

时间:2012-02-06 15:15:04

标签: c++ c++11

在C ++ 11中,我们现在可以在函数参数中动态构造对象。

例如,我们可以将新对插入到std :: map中,如下所示:

typedef std::map<char, int> MapType;
MapType my_map;

my_map.insert({'f', 6}); //less verbose than make_pair

这也适用于std :: vector。但是,对于std :: array,这奇怪地不起作用。

示例:

#include <iostream>
#include <array>
#include <vector>

using namespace std;

void arr_on_fly(std::array<int, 4> arr)
{
    /*...*/
}

void vec_on_fly(std::vector<int> vec)
{
    /*...*/
}

int main() 
{
vec_on_fly({1, 2, 3, 4});
arr_on_fly({1, 2, 3, 4});
}

链接:http://ideone.com/gvIUF

为什么这不起作用?这是C ++ 11标准中的缺陷吗?

错误“无法将'{1,2,3,4}'转换为'std :: array'”似乎很荒谬,因为我们可以像这样初始化std :: array:

std::array<int, 4u> arr = {1, 2, 3, 4};

2 个答案:

答案 0 :(得分:2)

我不知道造成这种不一致的原因。但是添加额外的括号使它可以编译。

arr_on_fly({{1, 2, 3, 4}});

答案 1 :(得分:0)

{}已超载。在balki的解决方案

arr_on_fly({{1, 2, 3, 4}});

外部括号表示推断构造对象,最内部括号表示构造初始化列表。

说实话,我很惊讶这个电话在任何情况下都不含糊。我不记得初始化列表和推断构造函数的交互的确切规则,但是如果你添加一个重载

arr_on_fly(std :: initializer_list <int>)

然后将其转换并将处理推迟到另一个应该起作用的函数。