Move-семантика с членом std :: vector - PullRequest
19 голосов
/ 24 ноября 2011

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

1 Ответ

18 голосов
/ 24 ноября 2011

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

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

Для правильно составленных классов обычно не требуется настраиваемая Большая Пятерка, вместо этого они полагаются на членов, предоставляющих их, и используют версию по умолчанию.

...