重複の可能性あり:
int var = 1; void main() { int i = i; }
次のコードは、g++ と Visual C++ の両方でコンパイルに合格します。なぜこれが合法なのでしょうか? 不合理に見え、隠れたバグを引き起こす可能性があります。
int main() {
int i = i;
}
ベストアンサー1
編集:その文法的に正しいただし、 を使用すると未定義の動作が発生しますx
。
そのない初期化されていない変数に別の (同じ) 初期化されていない変数を割り当てているため、合法です。コンパイルできるからといって合法であるとは限りません。確かに有効な C++ 構文ですが、合法ではありません。
代入演算子の右側は、代入時に完全に評価される必要があります。この場合、それは でありi
、初期化されていません。
この引用文を発掘した Steve Jessop 氏に感謝します。
4.1/1、左辺値から右辺値への変換
[...] オブジェクトが初期化されていない場合、この変換を必要とするプログラムの動作は未定義になります。