Je cours, chacun d'entre eux retournent son nomEst-il prudent d'utiliser const char * literal comme une clé std :: map?
struct IFoo {
virtual const char * GetName() const = 0;
}
struct Foo : IFoo {
const char * GetName() const { return "Foo"; }
}
struct Bar: IFoo {
const char * GetName() const { return "Bar"; }
}
Et ailleurs:
Foo* a = new Foo();
Foo* b = new Foo();
std::map<const char *, int> data;
data[a->GetName()] = 0;
printf("%i", data[b->GetName()]);
littéraux de chaîne doivent être stockés dans un endroit à la mémoire, mais est-ce 100%? Ce code fonctionne dans gcc, mais je ne suis pas sûr de son multi-plateforme.
Oui ceci est sûr, en fait la disposition a été spécifiquement ajoutée à la norme C++ pour que cela fonctionne –
Ceci est sûr, tant que vous appelez 'operator []' avec les résultats de 'GetName()'. Si vous essayez de l'appeler avec "Foo" 'codé en dur à partir d'une autre unité de traduction, le résultat n'est pas garanti. Sur 'gcc', cela fonctionnera car il fusionne des pools constants par défaut. – dasblinkenlight
Très proche, presque un doublon: [Adresse littérale chaîne à travers les unités de traduction] (http://stackoverflow.com/q/26279628/335858) – dasblinkenlight