Tenga una mirada en este fragmento de códigoconfusión objeto temporal
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
¿Por qué?
Tenga una mirada en este fragmento de códigoconfusión objeto temporal
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
¿Por qué?
es garantizado?
Sí, está garantizado. Los valores de S().i
y S().j
serían 0
. ()
implica value initialization. (que significa i
j
y sería inicializada a cero porque S
es una clase sin un constructor por defecto de usuario definido)
De C++ estándar ISO/IEC 14882: 2003 (E) punto 3.6.2
Los objetos con una duración de almacenamiento estático (3.7.1) se inicializarán en cero (8.5) antes de que se lleve a cabo cualquier otra inicialización .
Esto es válido ya que ambas variables tienen cero inicialización.
No veo ningún objeto con la asignación de almacenamiento estático aquí. La expresión 'S()' crea un ** objeto temporal ** local al alcance de 'assert()'. –
Desea la sección 8.5, que trata sobre el caso general de la inicialización. – birryree
lo siento ... de alguna manera pensé que él está usando la variable global –
Técnicamente, sí. Se inicializarán en 0
(al menos en una versión sin depuración para la mayoría de los compiladores. El compilador de Visual Studio generalmente inicializará las variables sin inicializar a un patrón específico en compilaciones de depuración)
.
Sin embargo, si estaba sentado en una revisión de código, no se sorprenda si le gritan por no inicializar explícitamente sus variables.
Garantizado para ser cero. Debido a los() refuerzos. –
Wow !!!! Muchas gracias. – Bollinger
En particular, agregar 'S() {}' (un ctor definido por el usuario sin nada) a 'struct S' hará que' i' y 'j' queden sin inicializar, lo que significa que' assert() 'es probable para disparar –
Sí, derecha [.....] –