c++ - 为右值特化 std::swap

标签 c++ c++11

在标准 (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/

相关文章:

c++ - 直接初始化与直接列表初始化 (C++)

c++ - 无法访问继承的变量

c++ - 使用 std::async 调用模板化成员函数

c++ - 错误 : No matching function for call to 'fraction::add(fraction&, fraction&)'

c++ - 为什么 Boost.ProgramOptions 不是只有标题?

c++ - 迭代器不可取消引用堆栈(表达式树)和循环无法正常工作

c++ - CHAR_BIT 替换

c++ - 无法编译: error: expected primary-expression before '(' token

c++ - 为什么 range-for 找不到我对 std::istream_iterator 的开始和结束重载?

c++ - 是否应允许 std::unique_ptr<void>