如果使用 {},函数调用不会有歧义
Function call not ambiguous if {} is used
#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
?
Why is {}
implicitly converted to int
?
这是copy-list-initialization,因为效果参数是value-initialized(zero-initialized) as 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>)
,一个user-defined转换(由std::vector
和std::deque
的构造函数采用std::initializer_list
) 是必须的;然后第一个重载在重载决议中获胜。
编辑:我想删除这个 post 因为它是错误的(抱歉,我忘记了 vector/deque 的初始化列表构造函数不是模板)。不幸的是,只要它是公认的答案,我就不能这样做。
std::vector
和 std::deque
的单参数构造函数是显式的。对于空的初始化列表,自动类型推导是不可能的,它消除了匹配 f(std::vector<int>)
和 f(std::deque<int>)
重载的所有方式。
所以构造一个int是唯一的匹配。
#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
?
Why is
{}
implicitly converted toint
?
这是copy-list-initialization,因为效果参数是value-initialized(zero-initialized) as 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>)
,一个user-defined转换(由std::vector
和std::deque
的构造函数采用std::initializer_list
) 是必须的;然后第一个重载在重载决议中获胜。
编辑:我想删除这个 post 因为它是错误的(抱歉,我忘记了 vector/deque 的初始化列表构造函数不是模板)。不幸的是,只要它是公认的答案,我就不能这样做。
std::vector
和 std::deque
的单参数构造函数是显式的。对于空的初始化列表,自动类型推导是不可能的,它消除了匹配 f(std::vector<int>)
和 f(std::deque<int>)
重载的所有方式。
所以构造一个int是唯一的匹配。