C++传递初始化列表时重载决议疑问:为何均输出plain int?
为什么
f({2})和f({})都调用const int&重载? 我们可以从C++重载决议的匹配优先级和列表初始化规则来分析这两个调用:
1. f({2})的匹配逻辑
你的代码中有两个重载:
void f(const int (&)[2]):要求实参是一个大小为2的const int数组(或能初始化该数组的列表)void f(const int&):要求实参是一个int(或能初始化int的列表)
对于{2}这个初始化列表:
- 匹配
const int&时:列表只有一个int类型元素,可直接初始化一个临时int对象(值为2),再绑定到const int&上,这属于精确匹配。 - 匹配数组重载时:列表元素个数(1)小于数组大小(2),编译器会自动值初始化第二个元素(补0)来完成数组初始化,这虽然可行,但属于非精确匹配(列表元素个数与数组大小不一致)。
在重载决议中,精确匹配的优先级高于非精确匹配,因此编译器选择const int&的重载。
2. f({})的匹配逻辑
对于空初始化列表{}:
- 匹配
const int&时:空列表会值初始化一个临时int对象(值为0),再绑定到引用上,这是可行的匹配。 - 匹配数组重载时:空列表会值初始化整个大小为2的数组(两个元素都是0),这也可行。
但根据C++重载决议的规则,标量类型的引用匹配优先级高于数组引用的匹配——标量的初始化逻辑更直接,编译器会优先选择更简单、更直接的匹配路径,因此还是会调用const int&的重载。
验证:如何触发数组重载?
如果传入的列表元素个数正好等于数组大小,比如f({1,2}),此时:
- 列表无法初始化
int(标量不能用多元素列表初始化),因此const int&重载不可行。 - 列表正好匹配数组的大小和类型,数组重载成为唯一可行选项,此时会输出
int array。
内容的提问来源于stack exchange,提问作者Ship
相关产品推荐
相关产品推荐

