为什么C++会优先选择基本类型的重载匹配,而不是更合适的初始化列表匹配?
#include <vector>
void foo([[maybe_unused]] int i) {}
void foo([[maybe_unused]] const std::vector<int>& v) {}
int main() {
foo(0);
foo({1,2,3});
foo({0}); // calls foo(int) and issues a warning,
// rather than what seems like the "better"
// match foo(vector).. why?
}
<source>:10:9: warning: braces around scalar initializer [-Wbraced-scalar-init]
foo({0}); // calls foo(int) and issues a warning,
^~~
也许这个结果令人惊讶,因为编译器选择了一个选项,然后又发出一条诊断信息?
使用 Clang 14。
foo
。 嗯,int就可以胜任这个角色。 - Lærnestd::initializer_list<int>
作为标题,它会获胜) - apple appleint
时会选择std::vector<int>
,它可以在不创建任何中间类型的情况下调用 foo?强制使用std::initializer_list
的规则仅适用于显式调用的函数/构造函数,而不适用于中间类型。否则,您可以争论任意创建中间类型,例如,它应该构建一个std::array<int, 1>
来构建一个std::deque<int>
来构建一个std::vector<int>
来调用foo
。 - Lærneint&
。 - apple apple