在标准(20.2.2 [utility.swap])中,std::swap 是为左值引用定义的。我知道这是当你想交换两件东西时的常见情况。但是,有时交换右值是正确且可取的(当临时对象包含引用时,如下所示:交换临时引用元组 https://stackoverflow.com/questions/21588477/swap-temporary-tuples-of-references).
为什么右值没有重载?对右值进行无意义的交换的风险是否超过了潜在的好处?
是否有合法的方法来支持交换包含引用的右值 std::tuple 对象?对于用户定义的类型,我会专门使用 swap 来按值接受其参数,但对于像 std::tuple 这样的库类型做同样的事情似乎不太合规矩。
不如创建一个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';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)