1. ホーム
  2. c++

[解決済み] C++、'if'式での変数宣言

2022-06-25 08:16:09

質問

どうなっているのでしょうか?

if(int a = Func1())
{
    // Works.
}

if((int a = Func1()))
{
    // Fails to compile.
}

if((int a = Func1())
    && (int b = Func2()))
)
{
    // Do stuff with a and b.
    // This is what I'd really like to be able to do.
}

2003年版標準のセクション6.4.3では、選択文の条件で宣言された変数が、その条件によって制御されるサブステートメントの終わりまで拡張されるスコープを持つことを説明しています。しかし、宣言の周りに括弧を置くことができないことについてはどこにも書かれていませんし、1 つの条件につき 1 つの宣言しかないことについても書かれていません。

この制限は、条件内の宣言が 1 つだけ必要な場合であっても、煩わしいものです。これを考えてみましょう。

bool a = false, b = true;

if(bool x = a || b)
{

}

もしxをfalseに設定して'if'のbodyスコープに入りたいなら、宣言は括弧を必要とします(代入演算子は論理和よりも優先順位が低いため)。しかし括弧が使えないため、xをbodyの外で宣言しなければならず、宣言は希望より大きな範囲に漏れることになります。明らかにこの例は些細なものですが、より現実的なケースは、a と b がテストする必要のある値を返す関数であるような場合です。

私がやりたいことは標準に準拠していないのでしょうか、それとも私のコンパイラーは私のボール (VS2008) を破壊しているだけなのでしょうか。

どのように解決するのですか?

C++17の時点で、あなたがやろうとしていたこと がようやく可能になりました。 :

if (int a = Func1(), b = Func2(); a && b)
{
    // Do stuff with a and b.
}

を使うことに注意してください。 ; の代わりに , を使うことで、宣言と実際の条件を分離することができます。