我在代码中遇到了一个错误,该错误正在调用错误的重载函数。
问题归结为:
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编译器资源管理器进行了研究,乍一看可以证实我的怀疑,但是我对汇编一无所知,因此无法确定。
所以问题是:这里发生了什么事?
答案 0 :(得分:9)
int*
与const int*
的类型不同。由于它们不是同一类型,因为您不能将引用绑定到其他类型,所以必须进行转换,然后将其声明为引用(处理派生对象时除外)。
这意味着int*
用于创建临时const int*
,并且该临时指针是一个右值。由于它是右值,因此将选择右值引用重载。