L'utilisation d'un libre « char const * » au moment de l'initialisation statique

StackOverflow https://stackoverflow.com/questions/790687

  •  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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top