【发布时间】:2013-06-10 12:11:24
【问题描述】:
什么时候隐式移动构造函数不够好?
我是否应该将它视为析构函数和复制构造函数,通常只有在我管理自己的内存时才需要它?
在这个(非常做作的)场景中,隐式移动构造函数是否足够好:
class A
{
private:
B b;
std::string name;
public:
A();
std::string getName() const {
return name;
}
B getB() const {
return b;
}
};
class B
{
private:
std::vector list;
public:
B();
std::vector getList() const {
return list;
}
};
【问题讨论】:
-
有时您需要手动编写移动构造函数来保持成员之间的“对齐”。如果您有一个字符串成员和一个引用字符串特定部分的
int成员,那么当移动对象时,int成员可能应该重置为0。 -
A类型对象的隐式移动构造函数将调用name和b的移动构造函数(这也是隐式的,并调用list的移动构造函数)。一切正常,与你无关。如果A有自己的堆管理或不可移动的成员(在这种情况下,您可能希望单独处理这些成员对象),请编写您自己的。 -
“什么时候隐式移动构造函数不够好?” - 当它们甚至不是由主要编译器供应商的愚蠢生成时。 ;) (抱歉,这绝对是 VC++ 中最严重缺失的功能。)
标签: c++ c++11 move-semantics