传递const int *和int *时,将调用不同版本的重载函数(const int * const&/ &&)

时间:2019-07-11 14:27:01

标签: c++ pass-by-reference implicit-conversion rvalue lvalue

我在代码中遇到了一个错误,该错误正在调用错误的重载函数。

问题归结为:

void func(const int* const& ptr){
    std::cout << "LValue reference\n";
}
void func(const int* const&& ptr){
    std::cout << "RValue reference\n";
}

int main(){
    const int* ptr;

    func(ptr);

    return 0;
}

上面的代码按预期工作,它显示LValue reference。 但是,当我将const int* ptr更改为int* ptr时,程序将打印RValue reference。这对我来说很奇怪,因为我通过了一个确认的LValue。 这使我相信正在发生某种隐式转换,从而将其转换为RValue。我确实使用godbolt编译器资源管理器进行了研究,乍一看可以证实我的怀疑,但是我对汇编一无所知,因此无法确定。

所以问题是:这里发生了什么事?

1 个答案:

答案 0 :(得分:9)

int*const int*的类型不同。由于它们不是同一类型,因为您不能将引用绑定到其他类型,所以必须进行转换,然后将其声明为引用(处理派生对象时除外)。

这意味着int*用于创建临时const int*,并且该临时指针是一个右值。由于它是右值,因此将选择右值引用重载。