¿Que está pasando aqui?
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 sección 6.4.3 de la norma de 2003 explica cómo las variables declaradas en una condición de declaración de selección tienen un alcance que se extiende hasta el final de las subdestaciones controladas por la condición. Pero no veo dónde dice nada sobre no poder poner paréntesis alrededor de la declaración, ni dice nada sobre una sola declaración por condición.
Esta limitación es molesta incluso en los casos en los que solo se requiere una declaración en la condición. Considera esto.
bool a = false, b = true;
if(bool x = a || b)
{
}
Si quiero ingresar el alcance 'if' -body con x establecido en falso, entonces la declaración necesita paréntesis (ya que el operador de asignación tiene menor precedencia que el OR lógico), pero dado que no se puede usar el paréntesis, requiere la declaración de x fuera el cuerpo, filtrando esa declaración a un alcance mayor del deseado. Obviamente, este ejemplo es trivial, pero un caso más realista sería aquel en el que a y b son funciones que devuelven valores que deben probarse
Entonces, ¿lo que quiero hacer es no conforme con el estándar, o mi compilador simplemente me está rompiendo las bolas (VS2008)?
while
son las mismas que para if
.
if (int a = foo(), int b = bar(), a && b)
? Si el operador de coma no está sobrecargado, el estándar dice que las expresiones se evalúan de izquierda a derecha y el valor del resultado es la última expresión. Funciona con for
inicialización de bucles, ¿por qué no aquí?
if
funciona, y parece ser una suposición incorrecta.
if
.if
no es un bucle, es un condicional.