我编写了一个具有两个重载的函数 - 一个用于单个指针,一个用于指针向量。在代码中的某个时刻,我想将一个空向量传递给函数并使用
{}
作为参数。
#include <vector>
#include <iostream>
void f(std::vector<const int*> v)
{
std::cout << "vector overload" << std::endl;
}
void f(const int* i)
{
std::cout << "pointer overload" << std::endl;
}
int main()
{
f({});
return 0;
}
不幸的是,这不会调用带有空向量的向量重载,而是调用带有
nullptr
的指针重载。
问题的解决方案是用引用替换指针重载,该引用无法用
{}
初始化。
void f(const int& i);
为什么编译器不会抱怨不明确的调用?为什么它更喜欢指针重载?
编译器更喜欢选择需要较少转换的重载(最好不需要转换)。
在这种情况下,可以从
{}
初始化指针,无需任何转换。const int* p{}; // will initialize `p` to `nullptr`
因此,为了调用第一个重载,它优于创建
std::vector<const int*>
。