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

pet*_*rpi 1 c++ move-semantics c++11

我是一个相当称职的C++用户(不是一个完整的菜鸟).我有一个充当资源句柄的类.这个类有一个移动构造函数和复制construtor被删除是有道理的:

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;
};
Run Code Online (Sandbox Code Playgroud)

多年来我一直以货物崇拜的方式做这件事而且工作正常.现在我正试图用我的C++ 11用法加强装备.

我还有一个类,它保持了vectorFoo:

struct Bar { // (Constructor added below)
  std::vector<Foo> foos;
};
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我天真地尝试写这样的Bar构造函数:

struct Bar {

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

  std::vector<Foo> foos;
};
Run Code Online (Sandbox Code Playgroud)

我的电脑有g ++ 4.9.2和clang ++ 3.5.0,它们都给我一小部分错误.他们都试图Bar.foos使用向量复制构造函数进行构造,然后失败,因为我删除了复制构造函数Foo.

我怎样才能将'vf',rvalue引用vector<Foo>直接赋予'foos'的构造函数?

Pet*_*ker 8

命名参数不是右值,因此您必须vf通过调用std::move以下内容将其转换为右值引用:

Bar(std::vector<Foo>&& vf) : foos(std::move(vf) {}
Run Code Online (Sandbox Code Playgroud)

而且,说用户必须调用std::movervalue参数是不正确的.std::move当参数是函数的返回值时,没有必要,这是rvalue的经典概念.