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



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

问题归结为:

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*,并且此临时指针是右值。 由于它是右值,因此将选择右值引用重载。

相关内容

最新更新