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