Domanda

§3.10 sezione 9 dice "non-classe rvalues sempre cv-non qualificato tipi".Che mi ha fatto pensare...

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 c'è nessuna tale cosa come un const rvalue per i non-tipi di classe, di sicurezza bar() preferisce associare a const int&&.È questo un bug del compilatore?

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

EDIT:Questo problema sembra essere risolto in g++ 4.5.0, entrambe le linee di stampa "rvalue" ora.

È stato utile?

Soluzione

Il comitato sembra già di essere a conoscenza che c'è un problema in questa parte della norma. CWG problema 690 si parla di un problema simile con esattamente la stessa parte della norma (la "nota aggiuntiva" da settembre 2009).Immagino nuova lingua sarà redatto per la parte di standard più presto.

Edit:Ho appena inviato un post su comp.std.c++, notare il problema e suggerendo nuovi termini per il relativo pezzo di standard.Purtroppo, essendo un moderatore di un newsgroup, quasi tutti probabilmente hanno dimenticato questa domanda con il tempo si fa attraverso la coda di approvazione lì.

Altri suggerimenti

Un buon punto.Credo che ci sono due cose da guardare:1) come hai sottolineato il non-classe rvalue thingsy e 2) come sovraccarico di risoluzione opere:

I criteri di selezione per il meglio funzione sono il numero di argomenti, quanto bene gli argomenti che corrispondono alla parametro di tipo a-elenco dei candidati funzione, [...]

Non ho ancora visto nulla in standard che mi dice di non-classe rvalues sono trattati in modo speciale durante la risoluzione dell'overload.

La tua domanda è coperta in la bozza di norma però mi (N-4411) un po':

Cosa vi viene in gioco, però, la lettura parallela di riferimento vincolante, la conversione implicita di sequenze, di riferimenti, di sovraccarico e di risoluzione in generale:

13.3.3.1.4 di Riferimento vincolante

2 Quando un parametro di riferimento tipo non è legato direttamente ad un argomento espressione, la conversione sequenza è quella necessaria per convertire l'argomento espressione sottostante tipo di riferimento sulla base per 13.3.3.1.

e

13.3.3.2 Classifica conversione implicita sequenze

3 Due implicito di conversione sequenze di la stessa forma sono indistinguibili conversione sequenze di meno che uno dei seguente regolamento si applica:

— Conversione Standard sequenza S1 è una conversione migliore sequenza di standard
conversione sequenza S2 se

— S1 e S2 sono associazioni di riferimento (8.5.3) e né, si riferisce ad un implicito oggetto di un parametro di non statici funzione membro dichiarato senza un ref-qualifier, e S1 associa una lvalue di riferimento per un lvalue e S2 si lega un rvalue di riferimento o S1 lega un rvalue di riferimento per un rvalue e S2 si lega un lvalue di riferimento.

[ 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&&)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top