c++ - 如何获取右值引用参数并将其传递到其他地方?

标签 c++ c++11 move-semantics

我是一个相当称职的 C++ 用户(不是一个完全的菜鸟)。我有一个充当资源句柄的类。该类具有 move 构造函数并删除复制构造函数是有意义的:

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;
};

多年来,我一直以 cargo 崇拜的方式这样做,而且效果很好。现在,我正尝试提高 C++11 的使用水平。

我有另一个类保留 vectorFoo :

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

我想为 Bar 编写构造函数调用者传入 vector<Foo> 的地方.我希望将调用者提供的整个 vector move 到 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;
}

我天真地试着写 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使用 vector 复制构造函数,然后失败,因为我删除了 Foo 的复制构造函数.

我如何给出'vf',即vector<Foo> 的右值引用?直接进入“foos”的构造函数?

最佳答案

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

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

此外,说用户必须为右值参数调用std::move 也不太正确;当参数是函数的返回值时,不需要 std::move,这是右值的经典概念。

关于c++ - 如何获取右值引用参数并将其传递到其他地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41211935/

相关文章:

c++ - 这对会被感动吗?

关于识别方法签名存在的 C++ 自省(introspection)

c++ - 不支持 vector 的 noexcept 要求

c++ - 如何在 C++ 中将不可复制的局部变量移出 lambda?

c++ - 静态全局函数的静态局部成员?

c++ - 我应该使用什么 C++ STL 类来减少由大量小分配引起的碎片?

c++ - 是否可以将 std::move 对象移出函数? (C++11)

c++ - 如何配置 WPP 以检测头文件(如模板)中的代码?

c++ - 从二维空间中的一组点构造一个圆。 80% 的给定点位于圆周上。剩下的 20% 是垃圾值。

c++ - 在多线程c++中捕获进程的输出