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

Rok*_*kas 3 c++ pass-by-reference rvalue lvalue implicit-conversion

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

问题归结为:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Nat*_*ica 9

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

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