73 votes

Résolution de surcharge entre objet, référence rvalue, référence const

Compte tenu de l'ensemble des trois fonctions, cet appel est ambigu.

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );

Retrait d' f( int ) provoque à la fois le Bruit et la GCC à préférer la référence rvalue sur la lvalue de référence. Mais au lieu de la suppression de la référence surcharge de résultats dans l'ambiguïté f( int ).

Résolution de surcharge est généralement fait en fonction d'un strict partielle de la commande, mais int semble être l'équivalent de deux choses qui ne sont pas équivalentes les unes aux autres. Quelles sont les règles? Je me souviens d'un rapport de défaut à ce sujet.

Est-il possible int && peut être préférée à l' int dans un futur standard? La référence doit se lier à un initialiseur, alors que le type d'objet n'est pas si limitée. Si la surcharge entre T et T && pourrait effectivement dire "utilisation de l'objet existant si j'ai été donné à la propriété, sinon d'en faire une copie." (Ceci est similaire à la pure passer par valeur, mais permet d'économiser les frais généraux de déplacement.) Comme ces compilateurs actuellement, cela doit être fait par une surcharge, T const & et T &&, et de manière explicite la copie. Mais je ne suis même pas sûr même qu'il est strictement standard.

65voto

Andrew Tomazos Points 18711

Quelles sont les règles?

Comme il n'y a qu'un seul paramètre, la règle est que l'un des trois viable paramètre d'initialisation de ce paramètre doit être un meilleur match que les deux les deux autres. Lorsque deux initialisations sont comparées, l'une est meilleure que l'autre, ou l'autre est mieux (ils sont indiscernables).

Sans des règles sur le direct de référence de liaison, tous les trois initialisations mentionnées seraient indiscernables (dans tous les trois comparaisons).

Les règles particulières à propos de direct de référence de liaison font int&& de mieux qu' const int&, mais aucune n'est meilleure ou pire qu' int. Il n'est donc pas le meilleur match:

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better

int&& est mieux que const int& en raison de 13.3.3.2:

S1 et S2 sont référence des liaisons (8.5.3) et ne se réfère à un objet implicite paramètre de non-fonction membre statique déclarée sans ref-qualificatif, et S1 lie référence rvalue à une rvalue et S2 lie une lvalue de référence.

Mais cette règle ne s'applique pas lorsque l'une des initialisations est pas une référence de liaison.

Est-il une chance d'int && peut être préférée à l'int dans un futur standard? La référence doit se lier à un initialiseur, alors que le type d'objet n'est pas si limitée. Si la surcharge entre T et T && peut effectivement signifier "utilisation de l'objet existant si j'ai été donné à la propriété, sinon d'en faire une copie."

Vous propose de faire une référence de liaison correspondent mieux qu'un non-référence de liaison. Pourquoi ne pas poster vos idée pour isocpp les futures propositions. Il n'est DONC pas le meilleur subjective discussion / avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X