专门为stval :: swap for rvalues

时间:2014-02-27 20:02:30

标签: c++ c++11

在标准(20.2.2 [utility.swap])中,为左值引用定义了std :: swap。我知道这是你想交换两件事的常见情况。但是,有时交换rvalues是正确和可取的(当临时对象包含引用时,例如:swap temporary tuples of references)。

为什么rvalues没有超载?对价值进行毫无意义的交换的风险是否超过了潜在的收益?

是否有合法的方法来支持交换包含引用的rvalue std :: tuple对象?对于用户定义的类型,我会专门使用swap来按值接受它的参数,但是对于像std :: tuple这样的库类型来说,这似乎不太合适。

2 个答案:

答案 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
}
}