加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 交换引用的临时元组

发布时间:2020-12-16 05:01:11 所属栏目:百科 来源:网络整理
导读:我正在编写一个自定义迭代器,当dereferenced返回一个引用元组时.由于元组本身是短暂的,我不认为我可以从operator *()返回引用.我认为我的迭代器在语义上是有意义的,因为它具有引用语义,即使operator *返回一个值. 问题是,当我尝试调用std :: swap(或者更确切
我正在编写一个自定义迭代器,当dereferenced返回一个引用元组时.由于元组本身是短暂的,我不认为我可以从operator *()返回引用.我认为我的迭代器在语义上是有意义的,因为它具有引用语义,即使operator *返回一个值.

问题是,当我尝试调用std :: swap(或者更确切地说,当std :: sort执行时),如下所示,我得到错误,因为交换需要l值.这个问题有一个简单的解决方法吗?

#include <vector>

class test {
  public:
  test()
    :v1(10),v2(10)
  {}

  class iterator {
    public:
    iterator(std::vector<int>& _v1,std::vector<int>& _v2)
      :v1(_v1),v2(_v2){}

    std::tuple<int&,int&> operator*(){
      return std::tuple<int&,int&>{v1[5],v2[5]};
    }
    std::vector<int>& v1;
    std::vector<int>& v2;
  };

  std::vector<int> v1,v2;
};



int main(){
  test t;
  //error,Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:3003:1: note: candidate function [with _Tp = std::__1::tuple<int &,int &>] not viable: expects an l-value for 1st argument

  //deep within the bowels of std::sort ...
  std::swap(*(test::iterator(t.v1,t.v2)),*(test::iterator(t.v1,t.v2)));
}

解决方法

在 rare occasions,可能需要获得临时的左值引用.这很容易通过与std :: move相反的转换来实现:
template <typename T>
T & stay(T && t) { return t; }

用法:

std::swap(stay(foo()),stay(bar()));

正如您已经说过的,如果您无法更改呼叫站点,您最好的选择可能是编写自己的参考包装并使用ADL:

namespace detail
{
    struct IntRefPair
    {
        int & a,& b;
        IntRefPair(int & x,int & y) : a(x),b(y) {}
    };

    void swap(IntRefPair && lhs,IntRefPair && rhs)
    { 
        std::swap(lhs.a,rhs.a);
        std::swap(lhs.b,rhs.b);
    }
}

// ...

IntRefPair operator*() { return IntRefPair(v1[5],v2[5]); } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读