std ::移动到一个函数

时间:2015-06-15 10:33:02

标签: c++ std move

我有这个示例代码:

UserData

怀疑1:

它打印两个0,因为main2中的构造函数和Struct2成员的构造。

事情是,我期待三个0,因为" setMember"正在收到一份'的副本,对吗?那发生了什么?

怀疑2:

我在想这个:

#include <iostream>

class Struct {
public:
   Struct() { std::cout << "0" << std::endl; }
   Struct(Struct&) { std::cout <<"1"<<std::endl;}
   Struct(const Struct&) { std::cout << "2" << std::endl; }
};

class Struct2 {
public:
    Struct s;

    Struct2() {}
    void setMember(const Struct& aux) { s = aux; }
};

int main()
{
    Struct s;
    Struct2 s2;
    s2.setMember(s);
}
// http://coliru.stacked-crooked.com/a/dd57e8af23f6db4b

因为我不会使用&#39;再次,但是setMember没有&#39;&amp;&amp;&#39;指定,可以吗?我还必须这样做吗? :

s2.setMember(std::move(s)); 

或者只用主要的就足够了?

怀疑3:

s = std::move(aux);

这是对的吗?我优化了什么动作&#39; a&#39;?它将不再使用,我想将它保存在矢量

由于

1 个答案:

答案 0 :(得分:2)

  

因为“setMember”正在收到's'的副本,对吗?

嗯,不。它正在接收const&并在赋值运算符上复制。由于您没有重载赋值运算符,因此不打印任何内容。

  

s2.setMember(std::move(s));

这不会解决任何问题; std::move只会将s转换为右值,但在函数内部它仍然是const&

经验法则:按值传递,向内移出:

void setMember(Struct aux) { s = std::move(aux); }

这样它将“自动”工作;将接口/移动rvalues上的左值复制到参数值中,然后将参数值移动到实际的对象成员中。

当然为了最好地利用那个机器,你需要一个rvalue,所以......

Struct s;
Struct2 s2;
s2.setMember(std::move(s));

或许......

s2.setMember(Struct());

话虽如此,你的旧代码不会破坏。

至于第三个例子,是的,这没关系,尽管我可能

  • 将更改移至a另一个功能push_back(function())
  • 将更改移至aA的构造函数并使用emplace_back