使用成员std :: vector移动语义

Set*_*gie 19 c++ vector move-constructor c++11

很抱歉,如果之前已经询问过,但据我所知,在C++ 11中,std::vector有一个移动构造函数,因此在某些情况下复制成本几乎没有,比如按值返回一个.但是,如果我有这样的类,使用vector作为成员变量:

class MyClass {
public:
    MyClass() { }
    MyClass(const MyClass& rhs) { }

    // other interfaces

private:
    std::vector<int> myvec;

    // implementation
};
Run Code Online (Sandbox Code Playgroud)

并且有一个函数可以按值返回其中一个,例如

MyClass somefunc() {
    MyClass mc;
    // fill mc.myvec with thousands (maybe even millions) of ints
    return mc;
}
Run Code Online (Sandbox Code Playgroud)

即使本身对移动构造函数一无所知,是否mc.myvec会调用移动构造函数和std::vector利用MyClass移动构造函数?或者是否vector要调用复制构造函数,并且int必须逐个复制所有数千个(甚至数百个)的复制构造函数?

Ker*_* SB 18

如果您没有编写任何显式副本或移动构造函数或任何副本或移动赋值运算符或析构函数,则默认提供的移动构造函数将逐个移动元素.有关详细信息,请参见12.8.9.

由于您定义了自己的复制构造函数,因此默认情况下不会获得移动构造函数.定义一个(可能= default),或者去除显式复制构造函数.

组合良好的类通常不需要任何自定义Big Five,而是依赖于提供它们的成员并使用默认版本.