Que se passe t-il ici?
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 section 6.4.3 de la norme 2003 explique comment les variables déclarées dans une condition d'énoncé de sélection ont une portée qui s'étend jusqu'à la fin des sous-instructions contrôlées par la condition. Mais je ne vois pas où cela dit quoi que ce soit sur le fait de ne pas pouvoir mettre de parenthèses autour de la déclaration, ni sur une seule déclaration par condition.
Cette limitation est ennuyeuse même dans les cas où une seule déclaration dans la condition est requise. Considère ceci.
bool a = false, b = true;
if(bool x = a || b)
{
}
Si je veux entrer la portée 'if' -body avec x défini sur false, la déclaration a besoin de parenthèses (puisque l'opérateur d'affectation a une priorité inférieure à l'OR logique), mais comme la parenthèse ne peut pas être utilisée, elle nécessite la déclaration de x à l'extérieur le corps, la fuite de cette déclaration à une portée plus grande que ce qui est souhaité. Évidemment, cet exemple est trivial mais un cas plus réaliste serait celui où a et b sont des fonctions renvoyant des valeurs qui doivent être testées
Est-ce que ce que je veux faire est non conforme à la norme, ou est-ce que mon compilateur ne fait que me casser les couilles (VS2008)?
while
sont les mêmes que pour if
.
if (int a = foo(), int b = bar(), a && b)
:? Si l'opérateur virgule n'est pas surchargé, la norme dit que les expressions sont évaluées de gauche à droite et la valeur du résultat est la dernière expression. Cela fonctionne avec l' for
initialisation des boucles, pourquoi pas ici?
if
fonctionne, et cela semble être une mauvaise hypothèse.
if
.if
n'est pas une boucle, c'est un conditionnel.