1. ホーム
  2. c++

[解決済み] クロスの初期化のサインは?

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' . 私の質問は

  1. 何が crosses initialization ?
  2. なぜ最初のイニシャライザである x + y はコンパイルに合格しますが、後者は失敗するのでしょうか?
  3. の問題点は何ですか? 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)なしで宣言されていなければ、不正な形式となる。