在标准(20.2.2 [utility.swap])中,为左值引用定义了std :: swap。我知道这是你想交换两件事的常见情况。但是,有时交换rvalues是正确和可取的(当临时对象包含引用时,例如:swap temporary tuples of references)。
为什么rvalues没有超载?对价值进行毫无意义的交换的风险是否超过了潜在的收益?
是否有合法的方法来支持交换包含引用的rvalue std :: tuple对象?对于用户定义的类型,我会专门使用swap来按值接受它的参数,但是对于像std :: tuple这样的库类型来说,这似乎不太合适。
答案 0 :(得分:3)
如何创建一个将{rvalue转换为左值的lvalue_cast
效用函数:
#include <tuple>
#include <iostream>
template <class T>
T&
lvalue_cast(T&& t)
{
return t;
}
int
main()
{
int i = 1;
int j = 2;
swap(lvalue_cast(std::tie(i)), lvalue_cast(std::tie(j)));
std::cout << i << '\n';
std::cout << j << '\n';
}
答案 1 :(得分:-1)
如果迭代器产生r值(例如临时值),某些STL算法似乎要求交换r值。
交换是否应该用r值表示是一个有效的讨论。
但是,我发现不解决这个问题的解决方法是为这些特殊迭代器专门化std::iter_swap
。我认为这解决了所有STL算法的问题。
namespace std{
void iter_swap(special_iterator it1, special_iterator it2){
... special swap of pointed values
}
}