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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top