繁体   English   中英

为什么不允许将rvalue引用绑定到非const引用,但允许在一个上调用非const成员函数

[英]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

以下大致相当于危险,但第二个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引用,当你期望它修改参数时,这会产生令人困惑的结果。 这种潜在的混淆是不允许临时绑定到非常量左值引用的理由。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM