繁体   English   中英

如何获取右值参考参数并将其传递给其他地方?

[英]How to take an rvalue reference parameter and pass it on elsewhere?

我是一个称职的C ++用户(不是一个完整的菜鸟)。 我有一个充当资源句柄的类。 对于该类而言,具有移动构造函数并且要删除复制构造函数是有意义的:

struct Foo {

  Foo (int i) : // For sake of example.
    x(i)
  {}

  Foo (Foo && f) :
    x(f.x)
  {
    f.x = 0; // 0 is special and means "moved from".
  }

  Foo (const Foo & f) = delete;

private:
  int x;
};

多年来,我一直以狂热的方式进行此操作,并且效果很好。 现在,我正在尝试提高C ++ 11的使用率。

我还有另一个保持Foo vector的类:

struct Bar { // (Constructor added below)
  std::vector<Foo> foos;
};

我想为Bar编写一个构造函数,在该构造函数中,调用者将传入vector<Foo> 我希望将调用者提供的整个向量移到Bar.foos 我想通过将构造函数参数设置为vector<Foo>&&而不是普通的vector<Foo>&来使调用者明确。 这样,调用者必须将std::move向量移到构造函数中。

int main (int argc, char ** argv)
{     
    Foo f1 (1);
    Foo f2 (2);
    std::vector<Foo> v;
    v.push_back (std::move(f1));
    v.push_back (std::move(f2));

    Bar b (std::move(v)); // I want the user to HAVE TO std::move v.
    return 0;
}

我天真地尝试编写如下的Bar构造函数:

struct Bar {

  Bar (vector<Foo> && vf) :
    foos (vf) // pass the rvalue reference into foos' constructor, right?
  {}

  std::vector<Foo> foos;
};

我的计算机上有g ++ 4.9.2和clang ++ 3.5.0,它们都给我带来一些小小的错误。 他们俩都试图使用矢量拷贝构造函数构造Bar.foos ,然后失败了,因为我已经删除了Foo的拷贝构造函数。

我如何才能直接将vector<Foo>的右值引用'vf'赋予'foos'的构造函数?

命名参数不是右值,因此您必须通过调用std::movevf转换为右值引用:

Bar(std::vector<Foo>&& vf) : foos(std::move(vf) {}

另外,说用户必须调用std::move作为一个右值参数是不太正确的。 当参数是函数的返回值时,则不需要std::move ,这是rvalue的经典概念。

通常,当您拥有仅移动类型的参数时,可以按值使用它:

struct Bar
{
    std::vector<Foo> foos;

    Bar(vector<Foo> vf) :
        foos(std::move(vf)a) {}
};

这迫使调用者写

Bar x(std::move(y));

这清楚地表明y所有权被放弃。 另外,调用者可以直接传递函数的返回值,而无需费心:

Bar x(get_me_some_Foos());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM