我在代码中遇到了一个错误,其中调用了错误的重载函数。
问题归结为:
void func(const int* const& ptr){
std::cout << "LValue referencen";
}
void func(const int* const&& ptr){
std::cout << "RValue referencen";
}
int main(){
const int* ptr;
func(ptr);
return 0;
}
上面的代码按预期工作,它打印LValue reference
.但是,当我const int* ptr
更改为int* ptr
时,程序打印RValue reference
。这对我来说很奇怪,因为我通过确认的LValue。这让我相信某种隐式转换正在发生,将其转变为 RValue。我确实使用 godbolt 编译器资源管理器研究了它,乍一看,它会证实我的怀疑,但我对汇编一无所知,所以我不能肯定地说。
所以问题是:这里发生了什么?
int*
与const int*
不同类型。 由于它们不是同一类型,因此必须进行转换,因为您无法将引用绑定到其他类型,因此声明为引用(处理派生对象时除外(。
这意味着int*
用于创建临时const int*
,并且此临时指针是右值。 由于它是右值,因此将选择右值引用重载。