为什么不允许将右值引用绑定到非常数引用,而允许在其中一个上调用非常数成员函数

Why are you not allowed to bind a rvalue reference to a non const reference but you are allowed to call non const member functions on one

本文关键字:引用 非常 一个 函数 成员 调用 在其中 不允许 绑定 为什么      更新时间:2023-10-16

以下内容在危险性方面大致相当,但语言不允许使用第二个2,而第一个则不然。

#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++让你做一些可能危险但可能有益的事情时,它会让它通过),但奇怪的是,这里有区别。

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

其他引用类型没有相应的混淆;const引用使对象按预期保持不变,并且右值引用专门用于绑定右值