2015-12-10 59 views
3

std::pair没有构造函数以初始化列表作为参数,但下面的代码如何编译?foo({1,2})如何为“void foo(对<int,int>)”工作

void foo(std::pair<int,int> pr) 
{ 
} 

void foo2(std::tuple<int,int,int> t) 
{ 
} 

void bar() 
{ 
    foo({1,2});        // compile OK 
    foo(std::pair<int,int>{1,2});    // compile OK 
    foo2(std::tuple<int,int,int>{1,2,3});  // compile OK 
    foo2({1,2,3});  // compile error 
} 

我使用clang3.7.0

回答

2

统一初始化是不是初始化列表。 Braced-init-list(用于初始化对象的{}的技术术语)可以调用的任何构造函数(尽管它可以仅限于非显式构造函数,具体取决于您如何使用它)。它倾向于构造函数initializer_list,但它会调用任何与其参数列表相匹配的构造函数。

因此,它调用pair构造函数,该构造函数接受适当类型的两个参数。

foo2是我之前提到的原因的编译错误。带有两个值的pair的构造函数不是显式的,但tuple的等价构造函数是显式的。因此,你需要明确地使用类型的名字来调用构造函数:

foo2(std::tuple<int, int, int>{1,2,3}); 

注意,在C++ 17,这tuple构造函数将被制成无明确的,如果在类型列表中的类型可以是非明确地从给定类型转换。所以你的原始声明应该在C++ 17实现下工作。 “

+0

”统一初始化与初始化程序列表无关。“我总是混淆{},非常感谢您的澄清! – camino

相关问题