当前位置: 首页 > 知识库问答 >
问题:

专用std::交换Rvalue

吕嘉赐
2023-03-14

在标准(20.2.2[utility.swap])中,std::交换是为左值引用定义的。我知道这是您想要交换两件事情的常见情况。但是,有时交换右值是正确和可取的(当临时对象包含引用时,如这里:交换临时引用元组)。

为什么重估没有超载?对重估进行无意义互换的风险是否超过了潜在的好处?

是否有合法的方法支持交换包含引用的rvalue std::tuple对象?对于用户定义的类型,我将专门化swap以按值接受其参数,但对于std::tuple这样的库类型,这样做似乎并不合适。

共有2个答案

利俊迈
2023-03-14

如果迭代器生成r值(例如临时值),则某些STL算法似乎需要交换r值。

swap是否应与r值一起使用是一个有效的讨论。我经常看到这个问题,因为对于“特殊”迭代器,它会生成一个r值,有时您希望在“交换”时做正确的事情。

我发现不处理这个问题的解决方法是首先为这些特殊的迭代器专门化std::iter_swap。我认为这解决了所有STL算法的问题。

namespace std{
void iter_swap(special_iterator it1, special_iterator it2){
   ... special swap of pointed values
}
}

我认为这是所有置换STL算法都遗漏和缺乏的基本定制点。

(当然,如果我们正在对STL进行黑客攻击,那么我们也可以使用名称空间std{模板

荀振国
2023-03-14

不如创建一个将右值强制转换为左值的实用函数:

#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';
}
 类似资料:
  • 在查看std::swap的文档时,我看到了许多专门化<看起来每个STL容器以及许多其他std设施都有专门的交换<我想借助模板,我们不需要所有这些专门化? 例如, 如果我编写自己的

  • 我会期望std::reference_wrapper在将non-const转换为const方面可以作为参考,例如: 下面的代码在MSVC和GCC中编译并运行良好,但在Clang上则不行。我只是不明白为什么,它是UB,还是实际上是关于Clang编译器的问题? 仅在Clang上,显示以下错误: https://wandbox.org/permlink/FSY4tCvE9B17hbVn

  • 下面的代码显示了我要做的:

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 我有一个场景,我需要执行一系列流程,每个步骤都在独立的应用程序中完成和扩展。我正在为所有交换使用主题交换。当前拓扑如下所示: P- 我们正在“版本化”队列,以处理可能影响消息结构的需求更改。绑定可能如下所示: 步骤1。exchange绑定到步骤1。v1。使用绑定键step1排队。v1 步骤1。exchange绑定到步骤1。v2。使用绑定键step1排队。v2级 还有其他与版本无关的绑定模式也使局部

  • <代码> 现在,我听到了关于专门化和的矛盾信息-有人告诉我,向std命名空间添加任何东西都会导致未定义的行为,而我也被告知,您可以提供自己的和的专门化。 这就是我现在正在做的: 这确实有效:http://ideone.com/wHVfkh 但我想知道,这样做有什么坏处?有更好的方法吗?