Question

Je suis un peu confus au sujet des règles de surcharge,

Disons qu'il y suivent des opérateurs littéral,

unsigned long long operator "" _xx(unsigned long long cooked_literal_int); //1
unsigned long long operator "" _xx(const char * raw_literal_string); // 2
unsigned long long operator "" _xx(long double cooked_literal_double); // 3

si à la fois 1, 2, et 3 sont définis, la surcharge est évident,

13_xx //call 1
13.5_xx //call 3

si 1 & 2 sont définis,

13_xx //call 1
13.5_xx //call 2

Si 2 et 3 sont définis

13_xx // call 2 or 3??
13.5_xx // call 3

La confusion vient du dernier c ++ 0x norme N3225 2.14.8 / 3,

  

Si L est un littéral entier défini par l'utilisateur, soit n le littéral sans son ud-suffixe. Si S contient un opérateur littéral avec le type de paramètre unsigned long long, le L littéral est traité comme un appel de la forme

     

opérateur "" X (n ULL)

     

Dans le cas contraire, S doit contenir un opérateur littéral brut ou un modèle d'opérateur littéral (13.5.8), mais pas les deux. Si S contient un opérateur littéral brut, le L littéral est traité comme un appel de la forme

     

opérateur "" X ( "n")

     

Dans le cas contraire (S contient un modèle d'opérateur littéral), L est traité comme un appel de la forme

     

opérateur "" X < » c1’ , « c2 », ... « ck »> ()

     

où n est la séquence de caractères source C1C2 ... ck.

Ceci indique que, si 1 est présent (un paramètre unsigned long long), 13_xx invoquera 1, sinon, 13_xx invoquera 2. Et à partir de 13.5.8,

  

En particulier, ils sont considérés comme des fonctions ordinaires et des modèles de fonction   et ils suivent les mêmes règles de résolution de surcharge.

De ma compréhension, si 1 n'est pas présent, 13_xx peut être converti implicitement à doubler et appeler 3.

Par conséquent, si 1 n'est pas présent, à la fois 2 et 3 sont en quelque sorte valide de la description standard.

J'espère que quelqu'un peut me aider à éclaircir mes doutes. Un grand merci.

Était-ce utile?

La solution

Je crois que 13.5.8 / 7 clarifie cette question:

  

Note: les opérateurs littéral et littérale   modèles d'opérateurs sont généralement invoqués   implicitement par l'intermédiaire défini par l'utilisateur   littéraux (2.14.8). Cependant, sauf pour les   les contraintes décrites ci-dessus , ils   sont des fonctions namespace de portée ordinaires   et des modèles de fonction. En particulier,   ils sont considérés comme des ordinaires   fonctions et modèles de fonction et   ils suivent la même surcharge   règles de résolution.

De ma compréhension, les règles de résolution de surcharge régulière sont seulement implicites pour les opérateurs littérales lorsqu'ils sont appelés à l'extérieur une invocation implicite par littéraux définis par l'utilisateur.

Je pense donc que si 2 et 3 sont définis, 13_xx appelle 2 (l'opérateur littéral brut).

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