很抱歉,如果以前曾经问过这个问题,但据我所知,在C ++ 11中,std::vector
有一个移动构造函数,因此在某些情况下复制成本几乎没有,比如按值返回一个。但是,如果我有这样的类,使用vector
作为成员变量:
class MyClass {
public:
MyClass() { }
MyClass(const MyClass& rhs) { }
// other interfaces
private:
std::vector<int> myvec;
// implementation
};
并且有一个函数可以按值返回其中一个,例如
MyClass somefunc() {
MyClass mc;
// fill mc.myvec with thousands (maybe even millions) of ints
return mc;
}
mc.myvec
的移动构造函数是否会被调用std::vector
的移动构造函数,尽管MyClass
本身对移动构造函数一无所知?或者是否会调用vector
的复制构造函数,并且必须逐个复制所有数千(甚至数百万)int
个?
答案 0 :(得分:18)
如果您没有编写任何显式复制或移动构造函数或任何复制或移动赋值运算符或析构函数,则默认提供的移动构造函数将逐个移动元素。有关详细信息,请参见12.8.9。
由于您定义了自己的复制构造函数,因此默认情况下不会获得移动构造函数。定义一个(可能是= default
),或者去掉显式的复制构造函数。
组合良好的类通常不需要任何自定义Big Five,而是依赖提供它们的成员并使用默认版本。