C++ 为什么不允许将右值引用绑定到非常量引用,但允许在一个引用上调用非常量成员函数

C++ 为什么不允许将右值引用绑定到非常量引用,但允许在一个引用上调用非常量成员函数,c++,reference,C++,Reference,从危险性的角度来看,以下两项大致相当,但该语言不允许第二项,而第一项则不允许 #include <algorithm> #include <vector> int main() { std::vector<int> v; // allowed std::vector<int>().swap(v); // not allowed v.swap(std::vector<int>());

从危险性的角度来看,以下两项大致相当,但该语言不允许第二项,而第一项则不允许

#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);
}
#包括
#包括
int main()
{
std::向量v;
//允许
std::vector().swap(v);
//不准
v、 交换(std::vector());
//不准
std::swap(std::vector(),v);
}
我知道VisualStudio将所有这些都作为一个编译器扩展来实现,我在这个问题上忽略了这一点


我实际上并不是在争论第一个被禁止的事实——我更喜欢第二个2个(有一些地方让代码更优雅,通常当C++允许你做一些危险的事情,但它可以让它通过)。但这里有一个区别似乎很奇怪。

函数参数需要进行类型转换,这会创建一个临时的右值。如果函数被传递给该临时变量的非常量引用,当您期望它修改参数时,这将导致混乱的结果。这种潜在的混淆是不允许临时变量绑定到非常量左值引用的理由

其他参考类型没有相应的混淆
const
引用保持对象未按预期修改,而右值引用专门用于绑定到右值。成员函数也不会出现问题,因为类型转换不会应用于被调用的对象