L'utilisation d'un libre « char const * » au moment de l'initialisation statique
-
16-09-2019 - |
Question
ordre d'initialisation des objets libres est indéfini en C ++. Mais qu'en est-ce qui suit?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
Est-ce un comportement encore non défini, ou est-il une disposition spéciale pour les pointeurs initialisés avec chaînes littérales?
En dehors de cela : si str était de type "char const []"? Et si c'était un std :: string?
La solution 2
L'ordre d'initialisation est définie - ils sont initialisés dans l'ordre où ils apparaissent dans une unité de compilation - voir la section 3.6.2 de la norme C ++. Le type des choses étant initialisées n'a pas d'effet.
Autres conseils
Même s'ils seraient situés dans différentes unités de traduction, l'ordre d'initialisation est toujours définie.
C'est parce que str
est initialisé avec une expression constante (address constant expression
) et str
a de type pod. Il serait encore vrai si vous tenir aviez un tableau. Mais il ne serait pas plus vrai si vous aviez un std::string
. Ceux-ci sont dynamiquement initialisés (parce que std::string
est un non-POD).
Ainsi, si votre str
était un std::string
, vous rencontrez un comportement non défini si obj
est défini dans une unité de traduction différente, mais qui est le seul cas de celui que vous avez indiqué que causerait des ennuis.