Будет ли C ++ использовать конструктор перемещения из оператора копирования? - PullRequest
1 голос
/ 23 февраля 2012

Скажем, у меня есть простая структура, которая содержит вектор и определяет оператор присваивания копии, и функция, которая возвращает эту структуру, например:

struct SimpleStruct
{
    vector< int > vec1;

    operator=( SimpleStruct& other )
    {
         vec1 = other.vec1;
    }
}

SimpleStruct GetStruct();

Насколько я понимаю, поскольку я объявил оператор присваивания копии, компилятор не будет автоматически генерировать конструктор перемещения для SimpleStruct.

Так что, если я использую функцию GetStruct следующим образом:

SimpleStruct value = GetStruct();

Достаточно ли умен компилятор, чтобы перемещать, а не копировать вектор, когда я говорю vec1 = other.vec1;? Или мне нужно будет явно определить конструктор перемещения / оператор присваивания для SimpleStruct, чтобы воспользоваться векторным перемещением?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

C ++ 11 имеет очень строгие правила относительно того, когда допускается движение.И если не используется временное, эти правила требуют явного использования std::move или аналогичного приведения (например, std::forward в некоторых случаях).

Да, вы могли бы что-то переместить,Но это не случилось бы случайно;это должно быть преднамеренным.

Кроме того, обычно грубо писать оператор присваивания копии, который может изменить то, что копируется.Вот почему они обычно принимают const&, что в значительной степени гарантирует невозможность перемещения.

Или мне нужно будет явно определить конструктор перемещения / оператор присваивания для SimpleStruct, чтобы использовать преимущества векторного перемещения?

В общем, именно поэтому вы не явно определяете конструкторы копирования и перемещения.Пусть компилятор выполнит свою работу и сгенерирует ее для вас (если вы не используете VC ++, который не выполняет свою работу для конструкторов / присваиваний перемещений).Только явно пишите конструкторы копирования / перемещения для контейнеров более низкого уровня;все, что больше, должно просто полагаться на эти типы значений для выполнения своей работы.

1 голос
/ 23 февраля 2012

Внутри конструктора копирования или оператора присваивания копии копирование означает копирование. Язык никогда не делает контекстной корректировки содержимого функции в зависимости от того, как она вызывается.

Однако вполне вероятно, что в SimpleStruct value = GetStruct(); копия не будет возникать, потому что применяется разрешение elis .

...