メインコンテンツ

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

const 修飾子付きの型と後続の変更への C++ 参照

const 修飾子付きの型の参照を後で変更

説明

この欠陥は、const 修飾型を参照する変数が宣言後に変更された場合に発生します。

たとえば、次の例で、refValconst int & 型ですが、その値が後続のステートメントで変更されています。

using constIntRefType = const int &;
void func(constIntRefType refVal, int val){
   ...
   refVal = val; //refVal is modified
   ...
}

リスク

参照型に対する const 修飾子は、宣言時にその型の変数が初期化され、それ以降変更しないことを意味します。

コンパイラは const 修飾子付きの型への参照の変更をコンパイル エラーと見なす可能性があります。コンパイラがこのエラーを検出しない場合、動作は未定義です。

修正方法

const 修飾子付きの参照型の変更を避けます。変更が必要な場合は、参照型の宣言から const 修飾子を削除します。

すべて展開する

typedef const int cint;           
typedef cint& ref_to_cint;       

void func(ref_to_cint refVal, int initVal){
   refVal = initVal;
}

この例では、ref_to_cintconst 修飾子付きの型への参照です。ref_to_cint 型の変数 refVal は、func が呼び出されるときに初期化され、以降は変更されないと想定されています。変更は const 修飾子による暗黙的なコントラクトに違反します。

修正 — const 修飾子付きの参照型の変更を回避

考えられる 1 つの修正方法として、参照型の宣言で const の使用を避けます。

typedef int& ref_to_int;       

void func(ref_to_int refVal, int initVal){
   refVal = initVal;
}

結果情報

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

バージョン履歴

R2019a で導入