メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

const 修飾子または volatile 修飾子付きの C++ の参照型

冗長な const 修飾子または volatile 修飾子で宣言されている参照型

説明

この欠陥は、参照型の変数が、次のように、const 修飾子または volatile 修飾子で宣言された場合に発生します。

char &const c;

リスク

C++14 規格では、const 修飾子または volatile 修飾子付きの参照は適格ではありません (ただし、typedef を通じて導入された場合は無視されます)。たとえば、ある変数への参照を別の変数への参照に使用することはできません。そのため、参照型の変数に対して const 修飾子を使用する必要はありません。

これらの修飾子の使用は多くの場合、コーディング エラーを示します。たとえば、次のように const 修飾子付きの型への参照を宣言しようとして

char const &c;
代わりに const 修飾子付きの参照を宣言したとします。
char &const c;
コンパイラがこのエラーを検出しない場合、予期しない結果が生じる可能性があります。たとえば、c が変更されないことを想定しているにもかかわらず、c の値が宣言時の値と異なる可能性があります。

修正方法

const 修飾子または volatile 修飾子が適切に配置されているかどうかを確認します。たとえば、const 修飾子付きの型への参照を意図して次のように入力しているかどうかを確認します。

char &const c;
以下のようにはしません。
char const &c;
修飾子が適切に配置されていない場合、エラーを修正します。const 修飾子または volatile 修飾子を & 演算子の前に配置します。そうでない場合、冗長な修飾子を削除します。

すべて展開する

int func (int &const iRef) {
    iRef++;
    return iRef%2;
}

この例では、iRefconst 修飾子付きの参照型です。iRef は別の変数を参照できないので、const 修飾子は冗長です。

修正 — const 修飾子を削除

冗長な const 修飾子を削除します。iReffunc 内で変更されるので、const 修飾子付きの変数への参照を意図していません。const 修飾子を & の前に移動すると、コンパイル エラーが発生します。

int func (int &iRef) {
    iRef++;
    return iRef%2;
}
修正 — 修飾子 const の配置を修正

func での iRef の変更が確認されない場合は、iRefconst 修飾子付きの変数への参照として宣言します。const 修飾子を & 演算子の前に配置します。iReffunc 内で変更していないことを確認します。

int func (int const &iRef) {
    return (iRef+1)%2;
}

結果情報

グループ: 適切な手法
言語: C++
既定値: オフ
コマンド ライン構文: CV_QUALIFIED_REFERENCE_TYPE
影響度: Low

バージョン履歴

R2019a で導入