我有这个示例代码:
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;?它将不再使用,我想将它保存在矢量
中由于
答案 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())
a
至A
的构造函数并使用emplace_back