C++, объявление переменной в выражении 'if'

Что здесь происходит?

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

Итак, то, что я хочу сделать, не соответствует стандарту, или мой компилятор просто не справляется со своими обязанностями (VS2008)?

104
задан Joris Timmermans 20 October 2011 в 14:56
поделиться