以下大致相当于危险,但第二个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.成员函数也不会出现问题,因为类型转换不会应用于被调用的对象.