问题描述
#include <stdio.h>
#include <vector>
#include <deque>
// 1st function
void f(int i,int j = 10){
printf("Hello World what");
};
void f(std::vector<int>){
printf("Hello World vec");
};
void f(std::deque<int>){
printf("Hello World deq");
};
int main()
{
f({});
return 0;
}
如果第一个函数被注释掉,编译时会得到ambiguous call
。如果未注释掉,则调用第一个函数。为什么将{}
隐式转换为int
?
实时示例:https://onlinegdb.com/rkhR0NiBD
解决方法
为什么
{}
隐式转换为int
?
这是copy-list-initialization,因为该参数的值初始化为0
值初始化(零初始化)。 int
可以从(空)braced-init-list初始化,就像int i{};
或int i = {};
一样。
- 在函数调用表达式中,将braced-init-list用作参数,并使用list-initialization初始化函数参数
要调用f(std::vector<int>)
和f(std::deque<int>)
,需要用户定义的转换(由std::vector
和std::deque
的构造函数采用std::initializer_list
);那么第一个重载将获得重载解决方案。
编辑:我想删除此帖子,因为它是错误的(抱歉,我忘记了vector / deque的初始化程序列表构造函数不是模板)。不幸的是,只要它是公认的答案,我就无法做到。
std::vector
和std::deque
的单个参数构造函数是显式的。对于空的初始化程序列表,无法进行自动类型推断,从而消除了所有与f(std::vector<int>)
和f(std::deque<int>)
重载匹配的方式。
因此,构造一个int是唯一的匹配项。