【问题标题】: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为什么不允许将右值引用绑定到非 const 引用,但允许在其中调用非 const 成员函数
【发布时间】:2015-03-24 11:36:01
【问题描述】:

以下内容在危险方面大致相同,但第二个 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++ 允许你做一些可能很危险但可能是有益的,它让它通过)但这里有区别似乎很奇怪。

【问题讨论】:

    标签: c++ reference


    【解决方案1】:

    函数参数受类型转换的影响,这会创建一个临时的右值。如果函数被传递给该临时的非常量引用,当您期望它修改参数时,这将产生令人困惑的结果。这种潜在的混淆是不允许临时对象绑定到非 const lvalue 引用的理由。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2020-12-03
      • 1970-01-01
      • 2015-06-10
      • 2013-05-08
      相关资源
      最近更新 更多