就危险而言,以下内容大致相同,但该语言不允许使用第二个,但第一个不是。
#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。如果函数被传递了对该临时变量的非常量引用,而您希望该函数修改参数,则结果将令人困惑。这种潜在的混乱是不允许临时对象绑定到非常量左值引用的理由。
其他参考类型没有相应的混淆;const
引用离开如预期未修饰的对象,而右值的引用具体意在结合右值。成员函数也不会出现此问题,因为类型转换不会应用于被调用的对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句