为什么不允许将右值引用绑定到非 const 引用,但允许在其中调用非 const 成员函数

2023-12-07

以下内容在危险性方面大致相同,但后两个是该语言不允许的,而第一个则不是。

#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v;

    // allowed
    std::vector<int>().swap(v);

    // not allowed
    v.swap(std::vector<int>());

    // not allowed
    std::swap(std::vector<int>(), v);
}

我知道 Visual Studio 让所有这些作为编译器扩展通过,但对于这个问题我忽略了这一点。

我实际上并不是在争论第一个被禁止 - 我实际上更喜欢第二个被允许(在某些地方这会使代码更加优雅,通常当 C++ 让你做一些可能危险但可能有益的事情时它让它通过)但这里有差异似乎很奇怪。


函数参数需要进行类型转换,这会创建一个临时的rvalue。如果函数传递了对该临时对象的非常量引用,而您希望它修改参数,则这会产生令人困惑的结果。这种潜在的混乱是不允许临时变量绑定到非常量变量的理由lvalue参考。

对于其他引用类型没有相应的混淆;const引用不会按预期修改对象,并且rvalue参考文献专门用于绑定rvalues。成员函数也不会出现此问题,因为类型转换不会应用于正在调用的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不允许将右值引用绑定到非 const 引用,但允许在其中调用非 const 成员函数 的相关文章

随机推荐