exponenta event banner

Параметр ссылки const rvalue может вызвать ненужные копии данных

const-ness ссылки на значение 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++
По умолчанию: Откл.
Синтаксис командной строки: CONST_RVALUE_REFERENCE_PARAMETER
Воздействие: Низкий
Представлен в R2021a