O que está acontecendo 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.
}
A seção 6.4.3 no padrão de 2003 expõe como as variáveis declaradas em uma condição de instrução de seleção têm escopo que se estende até o final das subinstruções controladas pela condição. Mas não vejo onde diz algo sobre não ser capaz de colocar parênteses em torno da declaração, nem diz nada sobre apenas uma declaração por condição.
Essa limitação é irritante mesmo nos casos em que apenas uma declaração na condição é necessária. Considere isto.
bool a = false, b = true;
if(bool x = a || b)
{
}
Se eu quiser inserir o escopo de corpo 'if "com x definido como falso, então a declaração precisa de parênteses (uma vez que o operador de atribuição tem precedência menor do que o OR lógico), mas como o parêntese não pode ser usado, ele requer a declaração de x fora o corpo, vazando essa declaração para um escopo maior do que o desejado. Obviamente, este exemplo é trivial, mas um caso mais realista seria aquele em que aeb são funções que retornam valores que precisam ser testados
Então, o que eu quero fazer não está em conformidade com o padrão, ou meu compilador está me dando mal (VS2008)?
while
são as mesmas que para if
.
if (int a = foo(), int b = bar(), a && b)
:? Se o operador vírgula não estiver sobrecarregado, o padrão diz que as expressões são avaliadas da esquerda para a direita e o valor do resultado é a última expressão. Funciona com for
inicialização de loops, por que não aqui?
if
funciona, e parece ser uma suposição errada.
if
.if
não é um loop, é uma condicional.