C++における「非常量参照の初期値は左でなければならない」という処理方法

1758 ワード

1左と右
C++では、付与文の左と右に左の値が表示されます.右の値は、付与文の右側にのみ表示され、付与文の左側には表示されません.変数は左、定数は右です.
2参照
参照(reference)はオブジェクトに別の名前を付け、参照タイプ参照(refers to)は別のタイプを参照します.変数名に「&」記号を追加することで定義します.参照の具体的な使い方は「C++の参照とリロード関数」を参照してください.
3非常量参照の初期値は左でなければなりません
3.1発生原因
カスタム関数increment()のコードは
void increment(double& x)

{

x += 1.0;

}

この関数を呼び出すとき、次のコードがあります.
increment(5);

increment()関数のパラメータはdouble&であり,呼び出し時の実パラメータは整形定数である.したがって、increment()関数を呼び出すと、実際には暗黙的なタイプ変換が存在します.
double& temp = (double)5;

x = temp;

その後increment()でパラメータxを修正すると仮定すると,実際には定数を修正することは許されないことは明らかである.したがって、非常量を初期化する場合、その初期値は左値でなければならず、右値ではない.したがって、「非常量参照の初期値は左でなければなりません」というエラーメッセージが表示されます.
3.2解決方法
以上の問題を解決するには、2つの方法があります.1つは、暗黙的な変換を避けることです.2つ目は、パラメータの変更を避けることです.
3.2.1暗黙的な変換を避ける
暗黙的な変換を回避するには、次の方法を使用します.
double i = 5.0l;

increment(i);

暗黙的な変換を回避し、すなわち非常量の参照の初期化を回避します.
3.2.2パラメータの変更を避ける
increment()関数のパラメータタイプをconst double&に変更すると、暗黙的な変換時に定数(右値)で初期化できます.
void increment(const double& x)

{

}

なお、この場合、パラメータxの値は定数であるため、increment()関数内部では変更できません.
4実戦
CSDNフォーラムで次のような質問をした友人がいます.
タイムクラスを定義し、coutを再ロードしてtimeクラスの時報エラーを出力します.そのエラーメッセージは「非常に参照される初期値は左でなければなりません」です.
ostream &  operator <

「C++関数の戻り値(上)」「関数の戻り値が非参照変数である場合、戻り値は一時変数で保存されます.関数の戻り値が参照変数である場合、一時変数を使用せずに直接戻ります」
リロードされた<<オペレータの戻り値は参照変数であるため、「3非常量参照の初期値は左値でなければならない」という一時変数の暗黙的な変換の問題はありません.このオペレータreturnは&osであり、osのアドレスを意味し、このアドレスは定数、すなわち右値である.オペレータが返す値は非常に多くの参照であるため、「非常に多くの参照の初期値は左でなければなりません」というエラーメッセージが生成されます.
リロードされた<<オペレータのreturnを
return os;

できます.