Considerando tutte e tre le funzioni, questa chiamata è ambigua.Risoluzione di sovraccarico tra oggetto, riferimento di rval, riferimento const
int f(int);
int f(int &&);
int f(int const &);
int q = f(3);
Rimozione f(int)
cause sia clang e GCC a preferire il riferimento rvalue sopra il riferimento lvalue. Invece rimuovere entrambi i sovraccarichi di riferimento genera ambiguità con f(int)
.
La risoluzione del sovraccarico viene solitamente eseguita in base a un rigoroso ordine parziale, ma lo int
sembra essere equivalente a due cose che non sono equivalenti l'una all'altra. Quali sono le regole qui? Mi sembra di ricordare un rapporto sui difetti al riguardo.
C'è qualche possibilità che lo int &&
sia preferito rispetto allo int
in uno standard futuro? Il riferimento deve essere associato a un inizializzatore, mentre il tipo di oggetto non è così vincolato. Quindi sovraccaricare tra T
e T &&
potrebbe effettivamente significare "utilizzare l'oggetto esistente se mi è stata data la proprietà, altrimenti fare una copia". (Questo è simile al puro pass-by-value, ma risparmia il sovraccarico dello spostamento.) Poiché questi compilatori funzionano attualmente, ciò deve essere eseguito sovraccaricando T const &
e T &&
e copiando esplicitamente. Ma non sono nemmeno sicuro che sia strettamente standard.
stato si' int && 'nel codice, ma poi generalizza a' T && 'nella domanda, nonostante siano diversi. Che cos'è? – Rapptz
@Rapptz Ho solo detto' T' quando parlo di possibili significati nell'uso del mondo reale. suggerire l'inoltro perfetto, questo è un gioco completamente diverso. – Potatoswatter