Що тут відбувається?
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
це не цикл, це умовний.