Co tu się dzieje?
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.
}
Sekcja 6.4.3 standardu z 2003 r. Wyjaśnia, w jaki sposób zmienne zadeklarowane w warunku instrukcji wyboru mają zakres, który rozciąga się do końca podstacji kontrolowanych przez warunek. Ale nie widzę, gdzie mówi cokolwiek o braku możliwości umieszczenia nawiasów wokół deklaracji, ani nie mówi nic o tylko jednej deklaracji na warunek.
To ograniczenie jest irytujące nawet w przypadkach, gdy wymagane jest tylko jedno oświadczenie w warunku. Rozważ to.
bool a = false, b = true;
if(bool x = a || b)
{
}
Jeśli chcę wprowadzić zakres „if” -body z x ustawionym na false, wtedy deklaracja wymaga nawiasu (ponieważ operator przypisania ma niższy priorytet niż logiczne OR), ale ponieważ nie można użyć nawiasu, wymaga deklaracji x na zewnątrz ciała, przeciekając tę deklarację do większego zakresu niż jest to pożądane. Oczywiście ten przykład jest trywialny, ale bardziej realistycznym przypadkiem byłby ten, w którym a i b są funkcjami zwracającymi wartości, które muszą zostać przetestowane
Czy to, co chcę zrobić, jest niezgodne ze standardem, czy też mój kompilator po prostu niszczy mi jaja (VS2008)?
while
są takie same jak dla if
.
if (int a = foo(), int b = bar(), a && b)
:? Jeśli operator przecinka nie jest przeciążony, standard mówi, że wyrażenia są obliczane od lewej do prawej, a wartość wyniku jest ostatnim wyrażeniem. Działa z for
inicjalizacją pętli, dlaczego nie tutaj?
if
działa, i wydaje się, że jest to błędne założenie.
if
.if
nie jest pętlą, jest warunkiem.