メインコンテンツ

const rvalue 参照パラメーターにより、不要なデータ コピーが発生する可能性があります

rvalue 参照の const の特性により、意図された移動操作が妨げられる

R2021a 以降

説明

この欠陥は、関数が const rvalue 参照をパラメーターとして取る場合に発生します。たとえば、この移動コンストラクターは const rvalue 参照を取ります。

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

リスク

rvalue 参照パラメーターの const の特性により、期待される移動操作が妨げられます。

たとえば、この問題は const パラメーターを持つコピー コンストラクターからのコピー アンド ペーストで移動コンストラクターを記述した場合に発生する可能性があります。次に例を示します。

aClass (const aClass& anotherClass);
コピー アンド ペーストした後、&&& に変更したものの、参照内またはコンストラクター本体のコピー操作で const を省略するのを忘れたとします。この場合、const rvalue 参照を持つ移動コンストラクターはエラーなしでコンパイルされますが、実際にデータをコピーする移動コンストラクターが非効率的になります。

修正方法

rvalue 参照パラメーターから const 修飾子を削除します。

たとえば、前のセクションでの移動コンストラクターは次のように書き換えることができます。

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
影響度: Low

バージョン履歴

R2021a で導入