règles pour l'utilisateur Surcharge défini littéraux en C ++ 0x
-
10-10-2019 - |
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.
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).