以下内容在危险性方面大致相当,但语言不允许使用第二个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
引用使对象按预期保持不变,并且右值引用专门用于绑定右值