[解決済み] クロスの初期化のサインは?
2023-06-03 20:39:52
質問
以下のコードを考えてみましょう。
#include <iostream>
using namespace std;
int main()
{
int x, y, i;
cin >> x >> y >> i;
switch(i) {
case 1:
// int r = x + y; -- OK
int r = 1; // Failed to Compile
cout << r;
break;
case 2:
r = x - y;
cout << r;
break;
};
}
G++は文句を言う
crosses initialization of 'int r'
. 私の質問は
-
何が
crosses initialization
? -
なぜ最初のイニシャライザである
x + y
はコンパイルに合格しますが、後者は失敗するのでしょうか? -
の問題点は何ですか?
crosses initialization
?
のスコープを指定するために括弧を使用しなければならないことは知っています。
r
を使用する必要があることは分かっていますが、例えばマルチケース switch 文で non-POD を定義できない理由を知りたいのです。
どのように解決するのですか?
を持つバージョンは
int r = x + y;
のバージョンもコンパイルされません。
この問題は
r
が、イニシャライザが実行されないままスコープに入る可能性があることです。イニシャライザーを完全に削除すれば、このコードはうまくコンパイルできます(つまり、この行は
int r;
).
一番良いのは、変数のスコープを限定することです。そうすれば、コンパイラと読者の両方を満足させることができます。
switch(i)
{
case 1:
{
int r = 1;
cout << r;
}
break;
case 2:
{
int r = x - y;
cout << r;
}
break;
};
スタンダードによると(6.7/3)です。
ブロックへの転送は可能であるが、初期化を伴う宣言を回避するような方法では不可能である。自動保存期間を持つローカル変数がスコープにないところから、スコープにあるところにジャンプするプログラムは、変数がPOD型(3.9)を持ち、初期化子(8.5)なしで宣言されていなければ、不正な形式となる。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較