El uso de un “const char *” libre en tiempo de inicialización estática
-
16-09-2019 - |
Pregunta
orden de inicialización de objetos libres no está definido en C ++. Pero ¿qué pasa con el siguiente?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
¿Es este comportamiento aún no definido, o hay una disposición especial para los punteros inicializados con literales de cadena?
Aparte de eso : ¿y si str fue de tipo "const char []"? Y si se trataba de un std :: string?
Solución 2
El orden de inicialización se define - que se inicializan en el orden en que aparecen en una unidad de compilación - véase la sección 3.6.2 del estándar de C ++. El tipo de las cosas ser inicializado no tiene ningún efecto.
Otros consejos
Incluso si ellos estarían ubicados en diferentes unidades de traducción, el orden de inicialización está todavía definido.
Eso es porque str
se inicializa con una expresión constante (address constant expression
) y str
tiene de tipo vaina. Todavía sería válido si tuviera una matriz. Pero no sería verdad más si has tenido una std::string
. Aquellos se inicializan de forma dinámica (porque std::string
es un no-POD).
Por lo tanto, si su str
fuera un std::string
, que se encontraría con un comportamiento indefinido si obj
se define en una unidad de traducción diferente, pero eso es el único caso de la persona que aparece en la lista podría causar problemas.