指针和带有指针的容器的重载解析

问题描述 投票:0回答:1

我编写了一个具有两个重载的函数 - 一个用于单个指针,一个用于指针向量。在代码中的某个时刻,我想将一个空向量传递给函数并使用

{}
作为参数。

#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);

为什么编译器不会抱怨不明确的调用?为什么它更喜欢指针重载?

c++ pointers initializer-list overload-resolution nullptr
1个回答
0
投票

编译器更喜欢选择需要较少转换的重载(最好不需要转换)。

在这种情况下,可以从

{}
初始化指针,无需任何转换。
您可以使用例如:

const int* p{};  // will initialize `p` to `nullptr`

因此,为了调用第一个重载,它优于创建

std::vector<const int*>

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.