El comportamiento observable es que se llama cada iteración.
Sin embargo, se aplican las reglas habituales sobre optimizaciones. Si el compilador es inteligente y el objeto simple entonces compilador puede hacer lo que le gusta que aún produce el comportamiento correcto, por ejemplo .:
#include <iostream>
struct foo {
int i;
foo() : i (-1) {}
~foo() { i = 1; }
};
int main() {
int i = 10;
while (--i) {
foo f;
std::cout << f.i;
}
}
compila en:
.Ltmp5:
.cfi_def_cfa_register %rbp
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
xorl %eax, %eax
popq %rbp
ret
es decir, desenrollado y no hay señal de ese destructor allí (aunque el comportamiento observable sigue siendo el mismo).
posible duplicado de [duración de la declaración dentro de un bucle] (http://stackoverflow.com/questions/3768662/lifetime-of-declaration-within-a-loop) –