1. ホーム
  2. c++

[解決済み] 関数呼び出し時に「制御の移行が初期化をバイパスする:」を切り替える

2022-03-02 06:03:20

質問

以下のスイッチをビルドしようとすると、"transfer of control bypasses initialization of:"というエラーが表示されます。

switch (retrycancel)
{
    case 4:    //The user pressed RETRY
        //Enumerate all visible windows and store handle and caption in "windows"
        std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); 
        break;

    case 2: 
        //code
}

私がenumerate関数を呼んでいることと関係があるようです。もし、switchの中から関数を呼び出すことが許されないのであれば、このような問題の回避策はあるのでしょうか?

解決方法は?

C++標準の6.6.4項を参照してください。

goto文は無条件に に制御を移します。 で示される識別子を持つ。この 識別子は、ラベル(6.1)でなければならない。 でなければならない。

C++標準の6.7項を参照してください。

に転送することは可能です。 ブロックがありますが をバイパスする方法ではありません。 初期化を伴う宣言 . A からジャンプするプログラム ローカル変数が自動的に 保存期間がスコープ内にない場合から を使用することはできません。 その変数がPODでない限り、不正な 型 (3.9) で宣言され、かつ イニシャライザー

強調表示 は私が追加しました。以来 switch は本当に goto という動作が発生します。これを解決するために、どうしても switch

switch (retrycancel)
    {
    case 4:
    {
        const std::vector<MainHandles::window_data> windows(
            MainHandles().enum_windows().get_results()
        );
        break;
    }
    case 2: 
        //code
    }

にリファクタリングするか if / else

if (retrycancel == 4) {
    const std::vector<MainHandles::window_data> windows(
        MainHandles().enum_windows().get_results()
    );
} else if (retrycancel == 2)
    // code
} else {
    ...
}

を作成することで何を達成したいのか、私には明らかではありませんが。 windows vector の中に switch ので、設計を見直す必要があるかもしれません。 備考 を追加しました。 const の修飾子を windows というのは、あなたの例では修正されていません。