Подтвердить что ты не робот

Move-semantics с элементом std::vector

Извините, если это было задано раньше, но, как я понимаю, в С++ 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 должны быть скопированы один за другим?

4b9b3361

Ответ 1

Если вы не пишете каких-либо явных конструкторов копирования или перемещения или каких-либо операторов копирования или перемещения или деструктора, то предоставленный по умолчанию конструктор перемещения перемещает элементы по очереди. Подробнее см. 12.8.9.

Поскольку вы определяете свой собственный конструктор копирования, по умолчанию вы не получите конструктор перемещения. Определите один (возможно, = default) или избавьтесь от явного конструктора копирования.

Хорошо составленные классы обычно не нуждаются в каких-либо пользовательских Big Five и вместо этого полагаются на членов, предоставляющих их, и используют версию по умолчанию.