std::move called on an unmovable type

std::move используется в типе класса без конструктора перемещения или оператора назначения перемещения

Описание

Этот дефект возникает, когда вы используете std::move перемещение объекта типа класса, у которого нет конструктора перемещения или оператора назначения перемещения.

Риск

Использование std::move в операторах, таких как:

Obj objTo {std::move(objFrom)};
objTo = std::move(objFrom);
указывает, что вы хотите получить преимущества от увеличения эффективности операции перемещения. Однако из-за отсутствия конструктора перемещения или оператора назначения перемещения вместо этого происходит операция копирования.

Если класс дорого копируется, операция непреднамеренного копирования может привести к потере эффективности.

Зафиксировать

Чтобы создать объект типа T movable, добавить конструктор перемещения:

T (T&&);
и переместить оператора назначения:
T& operator=(T&&);
к классу T. Если класс не должен непосредственно управлять ресурсом, можно использовать созданные компилятором операторы move с помощью =default синтаксис, например:
T (T&&) = default;

В противном случае, если операция перемещения не требуется, удалите std::move вызовите и непосредственно скопируйте объект.

Эффективность улучшения могут варьироваться в зависимости от используемого компилятора, реализации библиотеки и окружения.

Примеры

расширить все

#include <utility>
#include <string>

class stringPair {
    std::string str1;
    std::string str2;

    public:
        stringPair(const stringPair & aPair); //Copy constructor
        stringPair& operator=(const stringPair & aPair);  //Copy assignment operator
};

void exchangePairs (stringPair& first, stringPair& second) {
    stringPair tempPair {std::move(first)};
    first = std::move(second);
    second = std::move(tempPair);
}

В этом примере тип stringPair не имеет конструктора перемещения или оператора назначения перемещения. Использование std::move для объектов этого типа вместо этого выполняются операции копирования.

Коррекция - Добавьте Конструктор Перемещения и Оператор Переноса Назначения

Задайте тип stringPair перемещаемый путем добавления конструктора перемещения или оператора назначения перемещения.

#include <utility>
#include <string>

class stringPair {
    std::string str1;
    std::string str2;
    
    public: 
        stringPair(const stringPair & aPair); //Copy constructor
        stringPair(stringPair && aPair) noexcept; //Move constructor
        stringPair& operator=(const stringPair & aPair);  //Copy assignment operator
        stringPair& operator=(stringPair && aPair) noexcept; //Move assignment operator
};

void exchangePairs (stringPair& first, stringPair& second) {
    stringPair tempPair {std::move(first)};
    first = std::move(second);
    second = std::move(tempPair);
}
Коррекция -- Удалить std::move звонить

Если вы не хотите делать тип stringPair подвижный, опускает std::move вызовы.

#include <utility>
#include <string>

class stringPair {
    std::string str1;
    std::string str2;
    
    public: 
        stringPair(const stringPair & aPair); //Copy constructor
        stringPair& operator=(const stringPair & aPair);  //Copy assignment operator
};

void exchangePairs (stringPair& first, stringPair& second) {
    stringPair tempPair {first};
    first = second;
    second = tempPair;
}

Информация о результатах

Группа: Эффективность
Язык: C++
По умолчанию: Off
Синтаксис командной строки : STD_MOVE_UNMOVABLE_TYPE
Влияние: Средний
Введенный в R2020b