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

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

Описание

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

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

Риск

A 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