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.