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用法加强装备.
我还有一个类,它保持了vector的Foo:
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'的构造函数?
命名参数不是右值,因此您必须vf通过调用std::move以下内容将其转换为右值引用:
Bar(std::vector<Foo>&& vf) : foos(std::move(vf) {}
Run Code Online (Sandbox Code Playgroud)
而且,说用户必须调用std::movervalue参数是不正确的.std::move当参数是函数的返回值时,没有必要,这是rvalue的经典概念.
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |