Что тут происходит?
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)?
while
такие же, как и для if
.
if (int a = foo(), int b = bar(), a && b)
:? Если оператор запятой не перегружен, стандарт говорит, что выражения оцениваются слева направо, а результатом является последнее выражение. Он работает с for
инициализацией циклов, почему не здесь?
if
работает, и это кажется неправильным предположением.
if
.if
это не цикл, это условный.