#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
最佳答案
Why is
{}
implicitly converted toint
?
这是 copy-list-initialization ,作为参数值初始化(零初始化)的效果为
0
. int
可以从(空)braced-init-list 初始化,就像 int i{};
或 int i = {};
.
- in a function call expression, with braced-init-list used as an argument and list-initialization initializes the function parameter
对于
f(std::vector<int>)
和 f(std::deque<int>)
要调用,需要用户定义的转换(由 std::vector
和 std::deque
的构造函数取 std::initializer_list
);那么第一个重载在重载决议中获胜。
关于c++ - 如果使用 {},函数调用不会产生歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64061910/