2017-05-04 7 views
1

La norme dit 17 C++:exceptions sur le modèle des arguments non de type

Un modèle argument pour un modèle paramètre non-type doit être une expression constante convertie ...

tout

la valeur de l'expression constante ne doit pas être l'adresse de

  • une chaîne littérale
  • un sous-objet
  • autres exeptions ...

par ma compréhension de la raison d'être de l'exception des chaînes littérales est qu'en fonction de la mise en œuvre il peut Soit que les occurrences de A<"abc"> dans différentes unités de traduction peuvent entraîner des instanciations différentes (comme les littéraux de chaîne ont une liaison interne), ou que les adresses de littéraux de chaîne peuvent être définies à l'adresse linki ng time (les littéraux de chaîne sont stockés dans une mémoire spéciale en lecture seule).

La première question est de savoir si ma compréhension de la raison d'être de l'exception des littéraux de chaîne est juste? Et la deuxième question est: quelle est la logique derrière l'exception des sous-objets d'objets qui ont une durée de stockage statique? Je soupçonnais que le problème pourrait être en alignement, mais l'alignement est fait dans le temps de compilation non?

Répondre

0

L'idée de base est que le nom mutilé va inclure le (nom du) symbole dont l'adresse est en cours de prise. Il n'y a pas un tel symbole pour un littéral de chaîne, donc vous devez inclure le littéral lui-même. Être en mesure de préciser les sous-objets, il faudrait de la même que le mutiler comprennent (potentiellement plusieurs) noms de type disambiguating:

struct A {}; 
struct B : A {}; 
struct C : A {}; 
struct D : B, C {} d; 

template<A*> struct X; 
void f(X<(A*)(B*)&d>*); 

Comme d'habitude, la norme permet d'éviter de reconnaître l'existence de choses comme mutiler, mais il est fortement tirée par eux.