Cosa sta succedendo qui?
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.
}
La sezione 6.4.3 dello standard del 2003 spiega come le variabili dichiarate in una condizione dell'istruzione di selezione abbiano un ambito che si estende alla fine delle sottostazioni controllate dalla condizione. Ma non vedo dove dice qualcosa sul non essere in grado di mettere parentesi intorno alla dichiarazione, né dice nulla su una sola dichiarazione per condizione.
Questa limitazione è fastidiosa anche nei casi in cui è richiesta una sola dichiarazione nella condizione. Considera questo.
bool a = false, b = true;
if(bool x = a || b)
{
}
Se voglio inserire l'ambito del corpo 'if' con x impostato su false, la dichiarazione necessita di parentesi (poiché l'operatore di assegnazione ha una precedenza inferiore all'OR logico), ma poiché le parentesi non possono essere utilizzate, richiede la dichiarazione di x all'esterno il corpo, facendo trapelare quella dichiarazione in un ambito più ampio di quanto si desideri. Ovviamente questo esempio è banale ma un caso più realistico sarebbe quello in cui aeb sono funzioni che restituiscono valori che devono essere testati
Quindi quello che voglio fare non è conforme allo standard, o il mio compilatore mi sta solo rompendo le palle (VS2008)?
while
sono le stesse di if
.
if (int a = foo(), int b = bar(), a && b)
:? Se l'operatore virgola non è sovraccarico, lo standard dice che le espressioni vengono valutate da sinistra a destra e il valore del risultato è l'ultima espressione. Funziona con l' for
inizializzazione dei loop, perché non qui?
if
funziona, e sembra essere un'ipotesi sbagliata.
if
.if
non è un ciclo, è un condizionale.