Const rvalue reference parameter may cause unnecessary data copies

The const-ness ссылки rvalue препятствует предполагаемой операции перемещения

Описание

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

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

Риск

The 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 квалификатор из параметра move constructor, чтобы разрешить мутацию параметра в теле конструктора.

#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