[英]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::move
将vf
转换为右值引用:
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.