21

抱歉,如果之前有人问过这个问题,但据我了解,在 C++11 中,std::vector有一个移动构造函数,因此在某些情况下,副本几乎不会花费任何成本,比如按值返回一个。但是,如果我有一个像这样的类,将 avector作为成员变量:

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是否会调用移动构造函数并利用移动构造函数?还是会调用 的复制构造函数,而所有成千上万(甚至可能是数百万)的s 都必须一个一个复制?std::vectorMyClassvectorint

4

1 回答 1

20

如果您不编写任何显式复制或移动构造函数或任何复制或移动赋值运算符或析构函数,则默认提供的移动构造函数会逐个移动元素。详见 12.8.9。

由于您定义了自己的复制构造函数,因此默认情况下不会获得移动构造函数。要么定义一个(也许= default),要么摆脱显式的复制构造函数。

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

于 2011-11-24T04:40:30.750 回答