何が起きてる?
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 つの宣言のみが必要な場合でも煩わしいものです。このことを考慮。
bool a = false, b = true;
if(bool x = a || b)
{
}
x を false に設定して 'if'-body スコープに入りたい場合は、宣言に括弧が必要です (代入演算子は論理 OR よりも優先順位が低いため)。ただし、括弧を使用できないため、外側で x を宣言する必要があります。その宣言を、必要以上の範囲にリークします。明らかにこの例は簡単ですが、より現実的なケースは、a と b がテストする必要がある値を返す関数である場合です。
それで、私がやりたいことは標準に準拠していないのでしょうか、それともコンパイラが私のボールを壊しているだけですか(VS2008)?