Что здесь происходит?
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.
}
В разделе 6.4.3 в стандарте 2003 года указывается, как переменные, объявленные в условии утверждения выбора, имеют область действия, которая распространяется до конца подстановок, контролируемых условием. Но я не вижу, где он говорит что-то о том, что он не может помещать круглые скобки вокруг объявления, и не говорит ничего об одном объявлении за условие.
Это ограничение раздражает даже в тех случаях, когда требуется только одно объявление в условии. Рассмотрим это.
bool a = false, b = true;
if(bool x = a || b)
{
}
Если я хочу ввести область "if" -body с x, установленным в false, объявление требует скобки (поскольку оператор присваивания имеет более низкий приоритет, чем логический ИЛИ), но поскольку скобка не может использоваться, она требует объявления из x вне тела, утечка этого объявления в больший объем, чем это необходимо. Очевидно, что этот пример тривиален, но более реалистичным будет случай, когда a и b являются функциями, возвращающими значения, которые необходимо протестировать
Итак, что я хочу сделать несоответствующим стандарту, или мой компилятор просто разбивает мои яйца (VS2008)?