C++11 foo({1,2})是如何为";void foo(成对<;int,int>;)";

C++11 foo({1,2})是如何为";void foo(成对<;int,int>;)";,c++11,C++11,std::pair没有将初始值设定项列表作为参数的构造函数,但是下面的代码是如何编译的 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});

std::pair
没有将初始值设定项列表作为参数的构造函数,但是下面的代码是如何编译的

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
}
void foo(std::pair pr)
{
}
void foo2(std::tuple t)
{
}
空条()
{
foo({1,2});//编译确定
foo(std::pair{1,2});//编译正常
foo2(std::tuple{1,2,3});//编译确定
foo2({1,2,3});//编译错误
}

我使用的是clang3.7.0

统一初始化与初始化列表无关。带大括号的init列表(用于初始化对象的
{}
的技术术语)可以调用任何构造函数(尽管它可以仅限于非显式构造函数,具体取决于您如何使用它)。它更喜欢
initializer\u list
构造函数,但它将调用与其参数列表匹配的任何构造函数

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

foo2
是一个编译错误,原因我在上面提到过
pair
接受两个值的构造函数不是显式的,但是
tuple
的等价构造函数是显式的。因此,您需要显式使用类型的名称来调用构造函数:

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

请注意,在C++17中,如果类型列表中的类型可以从给定类型非显式转换,则此
元组
构造函数将变为非显式。因此,您的原始语句应该在C++17实现下工作。

“统一初始化与初始值设定项列表无关。”我总是混淆{},非常感谢您的澄清!