以下内容在危险性方面大致相同,但后两个是该语言不允许的,而第一个则不是。
#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++ 让你做一些可能危险但可能有益的事情时它让它通过)但这里有差异似乎很奇怪。
函数参数需要进行类型转换,这会创建一个临时的rvalue。如果函数传递了对该临时对象的非常量引用,而您希望它修改参数,则这会产生令人困惑的结果。这种潜在的混乱是不允许临时变量绑定到非常量变量的理由lvalue参考。
对于其他引用类型没有相应的混淆;const
引用不会按预期修改对象,并且rvalue参考文献专门用于绑定rvalues。成员函数也不会出现此问题,因为类型转换不会应用于正在调用的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)