在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});
}
为什么这不起作用?这是C ++ 11标准中的缺陷吗?
错误“无法将'{1,2,3,4}'转换为'std :: array'”似乎很荒谬,因为我们可以像这样初始化std :: array:
std::array<int, 4u> arr = {1, 2, 3, 4};
答案 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>)
然后将其转换并将处理推迟到另一个应该起作用的函数。