2010-01-30 4 views
33

§3.10 la sezione 9 dice "i rvalues ​​di non classe hanno sempre cv-tipi non qualificati". Che mi ha fatto chiedo ...i rvalues ​​non di classe hanno sempre cv-tipi non qualificati

int foo() 
{ 
    return 5; 
} 

const int bar() 
{ 
    return 5; 
} 

void pass_int(int&& i) 
{ 
    std::cout << "rvalue\n"; 
} 

void pass_int(const int&& i) 
{ 
    std::cout << "const rvalue\n"; 
} 

int main() 
{ 
    pass_int(foo()); // prints "rvalue" 
    pass_int(bar()); // prints "const rvalue" 
} 

Secondo la norma, non v'è alcuna cosa come un rvalue const per i tipi non-classe, eppure bar() preferisce legarsi a const int&&. È un bug del compilatore?

EDIT: A quanto pare, this è anche un rvalue const :)

EDIT: Questo problema sembra essere risolto in g ++ 4.5.0, entrambe le righe stampate "rvalue" ora.

+0

wow, ottima domanda. Vorrei poter votare due volte. –

+0

Se potessi offrire una taglia di 100 punti per la risposta. – Omnifarious

+0

Quale compilatore stai usando? g ++ 4.3.2 si è lamentato di non essere in grado di sovraccaricare la funzione pass_int con una variante const. – rajeshnair

risposta

11

Il comitato sembra già di essere a conoscenza che c'è un problema in questa parte dello standard. CWG issue 690 parla di un problema un po 'simile con esattamente la stessa parte dello standard (nella "nota aggiuntiva" di settembre 2009). Immagino che presto verrà redatta una nuova lingua per quella parte dello standard.

Modifica: ho appena inviato un post su comp.std.C++, annotando il problema e suggerendo nuove parole per il pezzo rilevante dello standard. Sfortunatamente, essendo un newsgroup moderato, quasi tutti probabilmente avranno dimenticato questa domanda nel momento in cui passerà attraverso la coda di approvazione lì.

+0

Basta modificare le nuove informazioni in seguito, la domanda dovrebbe quindi apparire nella scheda * attiva *. –

+0

Quindi, il messaggio è stato ancora approvato? – Omnifarious

+0

Il messaggio è stato approvato e pubblicato, ma nessuno ha risposto/seguito (ancora?) –

2

Buon punto. Credo che ci sono due cose da guardare: 1) come lei ha sottolineato il rvalue thingsy non di classe e 2) come funziona la risoluzione di sovraccarico:

I criteri di selezione per il miglior funzionamento sono il numero di argomenti, quanto bene gli argomenti corrispondono al parametro di tipo list della funzione candidato , [...]

non ho visto nulla nel standard che mi dice rvalues ​​non-classe sono trattati in modo speciale durante risoluzione di sovraccarico.

La tua domanda è coperto nella bozza dello standard che ho anche se (N-4411) in qualche modo:

Che cosa significa entrare in gioco è comunque una lettura in parallelo di riferimento vincolante, sequenze di conversione implicita, i riferimenti, e il sovraccarico risoluzione in generale:

13.3.3.1.4 riferimento vincolante

2 Quando un parametro di tipo riferimento non è associato direttamente a un argomentoEspressione, la sequenza di conversione è quella richiesta per convertire l'espressione argomento nel tipo sottostante del riferimento in base a a 13.3.3.1.

e

13.3.3.2 Classifica sequenze conversione implicita

3 Due sequenze di conversione implicite del stessa forma sono indistinguibili sequenze di conversione meno applica una delle seguenti regole:

- Sequenza di conversione standard S1 è una c migliore sequenza di inversione rispetto allo standard
sequenza di conversione S2 se

- S1 e S2 sono collegamenti di riferimento (8.5.3) e non si riferisce ad un parametro oggetto implicito di un non statico funzione membro dichiarato senza un ref-qualificazione, e sia S1 lega un lvalue riferimento ad un Ivalue e S2 si lega un riferimento rvalue o S1 lega un rvalue riferimento a un valore di rvalore e S2 associa un riferimento di lvalue.

[Esempio:

int i; 
int f(); 
int g(const int&); 
int g(const int&&); 
int j = g(i); // calls g(const int&) 
int k = g(f()); // calls g(const int&&) 
Problemi correlati