static const membre de l'initialisation d'une variable
Regarde comme je peux l'init d'un POD static const membre, mais pas les autres types:
struct C {
static const int a = 42; //OK
static const string b = "hi"; //compile error
};
Pourquoi?
Je parie que quelqu'un va répondre avec une citation de la norme, qui n'a pas vraiment vous dire pourquoi 🙂
J'ai évité la norme.
T pense que c'est parce qu'il doit être evaluatet au moment de la compilation. C'est pourquoi elle travaille également avec constexpr en C++11
Et vous êtes aussi en tentant d'expliquer pourquoi, ce qui est bon.
ce n'est pas une réponse complète; pas toute l'histoire. J'ai peut-tin.
J'ai évité la norme.
T pense que c'est parce qu'il doit être evaluatet au moment de la compilation. C'est pourquoi elle travaille également avec constexpr en C++11
Et vous êtes aussi en tentant d'expliquer pourquoi, ce qui est bon.
ce n'est pas une réponse complète; pas toute l'histoire. J'ai peut-tin.
OriginalL'auteur Deqing | 2014-07-17
Vous devez vous connecter pour publier un commentaire.
La syntaxe
initializer in the class definition
n'est autorisée qu'avec l'intégrale et les types d'énumérations. Pourstd::string
, il doit être défini en dehors de la définition de la classe et initialisé.static members
doit être défini dans une unité de traduction de remplir l'une définition de la règle. Si le C++ permet la définition ci-dessous;b
devrait être défini dans chaque unité de traduction qui comprend le fichier d'en-tête.C++ ne permet que de définir
const static
de données des membres deintegral
ouenumeration
type dans la déclaration de classe, comme un raccourci. La raison pour laquelleconst static
de données des membres d'autres types de ne peut pas être défini, c'est que non-trivial d'initialisation serait nécessaire (constructeur doit être appelé).J'ai répondu à la
why
partie, merci.OriginalL'auteur Alper
string
n'est pas un type primitif (commeint
) mais est une classe.Interdisant cela est raisonnable; l'initialisation de
static
s qui se passe avantmain
. Et les constructeurs peuvent invoquer toutes sortes de fonctions qui peuvent ne pas être disponibles lors de l'initialisation.static const char* string = "hi";
devrait fonctionner, non?Alors pourquoi est-il possible d'initialiser statique habitants de la ville en fonction au moment de l'appel de la fonction?
Ce n'est pas vrai - il est possible d'initialiser des constantes à d'autres étendues de ce genre. Il également n'a pas d'expliquer d'autres primitives comme
const char*
."Les constructeurs peuvent invoquer toutes sortes de fonctions qui peuvent ne pas être disponibles lors de l'initialisation"? Cela implique que les objets globaux (c'est à dire, mondial de non-primitive variables) doit également être rejetée (qui, comme vous le savez, n'est pas le cas).
OriginalL'auteur Bathsheba
Je vais résumer les règles sur l'initialisation de classe sur le C++98 vs C++11:
Le code suivant est illégal en C++03, mais fonctionne exactement comme vous l'attendez en C++11. En C++11, vous pouvez considérer que les initialiseurs d'être injecté dans chacun des constructeurs de la nacelle, à moins que le constructeur définit une autre valeur.
Rendre les champs mutables les membres statiques casser le code dans les deux normes, c'est parce que le
static
assure qu'une copie de la variable et, par conséquent, de déclarer les membres dans un exactement un fichier, tout comme nous le ferions avec des variables globales à l'aide de la visée à l'aide du mot-clé extern.Si nous essayons de les faire, const membres statiques d'un nouvel ensemble de règles surviennent:
Donc, à partir de C++11, il est permis de faire constantes statiques de non-entier trivial types de variable. Les chaînes malheureusement ne correspond pas au projet de loi, donc on ne peut initialiser constexpr std::les chaînes de caractères, même en C++11.
Tout n'est pas perdu, cependant, comme une réponse à ce post mentionne, vous pouvez créer une chaîne de fonctions de classe comme une chaîne littérale.
NB! Notez que vous c'est la métaprogrammation à son meilleur, si l'objet est déclaré comme constexpr statique à l'intérieur d'une classe, puis, dès que vous entrez au moment de l'exécution, l'objet est nulle part pour être trouvée. Je n'ai pas compris pourquoi, n'hésitez pas à commenter.
Maintenant, vous pouvez déclarer une conststr directement en vous classe:
OriginalL'auteur Stian V. Svedenborg