2010-12-08 3 views
2

Je suis un peu confus au sujet des règles de surcharge,règles Surcharger pour définies par l'utilisateur littéraux en C++ 0x

disons qu'il SUIVEZ opérateurs littérales,

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 les deux 1, 2, & 3 sont définis, la surcharge est évident,

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

si une & 2 sont définis,

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

si 2 & 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 entier défini par l'utilisateur -literal, soit n le littéral sans son suffixe-ud. 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.

Cela dit, si 1 est présent (un paramètre unsigned long long), 13_xx invoquera 1, sinon, 13_xx appel sont 2. Et à partir de 13.5.8,

En particulier, ils sont recherché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 & 3 sont en quelque sorte valide de la description standard.

J'espère que quelqu'un peut m'aider à effacer mes doutes. Merci beaucoup.

Répondre

4

Je crois que 13.5.8/7 clarifie cette question:

Note: les opérateurs littérales et littérales modèles de l'opérateur sont généralement invoquées implicitement par définis par l'utilisateur littéraux (2.14.8).Cependant, à l'exception de les contraintes décrites ci-dessus, ils sont des fonctions de portée d'espace de noms ordinaires et des modèles de fonction. En particulier, ils sont recherchés comme les fonctions ordinaires et les modèles de fonction et ils suivent les mêmes règles de résolution de surcharge.

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'il est appelé en dehors une invocation implicite par littéraux définis par l'utilisateur.

Donc je pense que si 2 & 3 sont définis, 13_xx appelle 2 (l'opérateur littéral brut).

+0

Merci. Ainsi, pour les littéraux définis par l'utilisateur, l'invocation implicite de ces fonctions opérateur littérales n'utilisera pas de conversions de type int-to-float, char-to-int et char-to-float. Seule l'invocation explicite de ces fonctions tentera d'appliquer une résolution de surcharge. Cela a du sens pour moi. – user534498

+0

Bien sûr que oui. L'expression "ils sont recherchés comme des fonctions ordinaires et des modèles de fonctions et ils suivent les mêmes règles de résolution de surcharge". Dit juste ce qu'il dit. Il ne dit pas les choses que l'interrogateur a conclues. Et il pourrait également être entièrement supprimé. C'est un texte non normatif. Les règles de 2.14.8/3 sont claires - elles ne sont pas compromises par la résolution des surcharges d'une manière ou d'une autre. –