在标准 (20.2.2 [utility.swap]) 中,std::swap 是为左值引用定义的。我知道当你想交换两件事时,这是常见的情况。然而,有时交换右值是正确且可取的(当临时对象包含引用时,如下所示:swap temporary tuples of references)。
为什么右值没有重载?对右值进行无意义交换的风险是否超过潜在 yield ?
是否有合法的方式来支持交换包含引用的右值 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';
}
关于c++ - 为右值特化 std::swap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079128/