我是一个相当称职的 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 的使用水平。
我有另一个类保留 vector
的 Foo
:
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::move
将 vf
转换为右值引用:
Bar(std::vector<Foo>&& vf) : foos(std::move(vf) {}
此外,说用户必须为右值参数调用std::move
也不太正确;当参数是函数的返回值时,不需要 std::move
,这是右值的经典概念。
关于c++ - 如何获取右值引用参数并将其传递到其他地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41211935/