Const rvalue reference parameter may cause unnecessary data copies

const- мыс rvalue ссылки предотвращает предназначенную операцию пересылки

Описание

Этот дефект происходит, когда функция берет const ссылка rvalue как параметр. Например, этот конструктор перемещения берет const ссылка rvalue:

class aClass {
   public:
     aClass (const aClass&& anotherClass);
}

Риск

const природа rvalue параметра ссылки предотвращает ожидаемую операцию пересылки.

Например, эта проблема может произойти, когда вы пишете конструктору перемещения вставкой копии от конструктора копии с const параметр, например:

aClass (const aClass& anotherClass);
После вставки копии вы можете изменить & к && но забудьте не использовать const в ссылке или операциях копии в теле конструктора. В этом случае, конструктор перемещения с const ссылка rvalue компилирует без ошибок, но приводит к неэффективному конструктору перемещения, который на самом деле копирует данные.

Фиксация

Удалите const спецификатор от rvalue параметра ссылки.

Например, конструктор перемещения в предыдущем разделе может быть переписан как:

class aClass {
   public:
     aClass (aClass&& anotherClass);
}
Вы можете также хотеть проверять тело конструктора перемещения и убедиться, что вы на самом деле перемещаете данные и не копирование.

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

Примеры

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

#include <string>
#include <utility>

class Task {
    public:
       Task( const Task& ) = delete;
       Task( const Task&& other ) noexcept; 
    private:
       std::string m_name;
       bool m_is_pending = false;
};

В этом примере у конструктора перемещения есть const ссылка rvalue, которая вызывает дефект.

Дефект, возможно, был введен, потому что конструктор перемещения был создан вставкой копии от конструктора копии, который удален здесь.

Коррекция – удаляет const от Параметра

Удалите const спецификатор от параметра конструктора перемещения, чтобы позволить мутацию параметра в теле конструктора.

#include <string>
#include <utility>

class Task {
    public:
       Task( const Task& ) = delete;
       Task( Task&& other ) noexcept; 
    private:
       std::string m_name;
       bool m_is_pending = false;
};

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

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