Что здесь происходит?
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' с x, установленным в false, тогда для объявления требуется скобка (так как оператор присваивания имеет более низкий приоритет, чем логическое ИЛИ), но поскольку скобка не может использоваться, она требует объявления x вне тела, утечка этого объявления в большую область, чем это желательно. Очевидно, этот пример тривиален, но более реалистичным будет случай, когда a и b являются функциями, возвращающими значения, которые должны быть проверены
Так что я хочу сделать не соответствующим стандарту, или мой компилятор просто разрушает мои шары (VS2008)?