Const std::move input may cause a more expensive object copy

Const std::move введите не может быть перемещен и результаты в более дорогой операции копии

Описание

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

Средство проверки повышает нарушение только для типов классов с нетривиальной операцией копии и операцией пересылки.

Риск

const объект не может быть изменен и поэтому не может быть перемещен. std::move на const объект тихо отступает к операции копии без ошибок компиляции. Ваш код может пострадать от более плохой эффективности без вас замечающий проблему.

Фиксация

Удалите const спецификатор от перемещаемого объекта.

Если вы хотите операцию копии вместо этого, удаляете избыточный std::move вызвать.

Обратите внимание на то, что эта проблема также инициировала средство проверки Move operation on const object, который применяется ко всем операциям пересылки на const объекты независимо от того, имеет ли тип класса операцию пересылки и нетривиальную операцию копии. Если вы решаете выровнять по ширине проблему, можно использовать то же выравнивание для обоих результатов.

Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.

Примеры

развернуть все

#include <string>

#include <string>

class MyClass {
public:
    void setName( const std::string& name ) {
        m_name = std::move( name );
    }
private:
    std::string m_name;
};

В этом примере, std::move называется на const объекты, name. Вместо присвоения перемещения происходит возможно более дорогое присвоение копии.

Удалите const Спецификаторы

Если вы хотите операции пересылки, удаляете const спецификатор из определений перемещаемых объектов.

#include <string>

#include <string>

class MyClass {
public:
    void setName( std::string& name ) {
        m_name = std::move ( name );
    }
private:
    std::string m_name;
};

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

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