2012-01-25 12 views
9

Sto provando a leggere un singolo carattere da uno streaming. Con il codice seguente ottengo un errore del compilatore "sovraccarico ambiguo" (GCC 4.3.2, and 4.3.4). Cosa sto facendo di sbagliato?Errore del compilatore GCC durante l'estrazione di un carattere da un flusso temporaneo

#include <iostream> 
#include <sstream> 

int main() 
{ 
    char c; 
    std::istringstream("a") >> c; 
    return 0; 
} 

Osservazione:

  • Visual Studio 2008 compila senza errori
  • Altri tipi (int, double) stanno lavorando
  • Se ho creo una variabile std::istringstream iss("a"); iss >> c, il compilatore dà nessun errore
+0

In realtà, nel tuo terzo punto elenco, è dove non stai _non_ creando una variabile temporanea. –

+0

@LightnessRacesinOrbit: Grazie, ho corretto l'ultimo punto. –

risposta

9

L'operazione di estrazione o >> per i caratteri è un modello di funzione non membro:

template<class charT, class traits> 
    basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); 

Dal momento che questo prende il primo argomento da non const riferimento, non è possibile utilizzare una temporanea rvalue lì. Pertanto, il tuo codice non può selezionare questo sovraccarico, solo i vari sovraccarichi della funzione membro, nessuno dei quali corrisponde a questo utilizzo.

Il codice è valido per C++ 11, perché c'è anche un operatore di estrazione prendendo un rvalue riferimento come primo argomento.

Visual Studio 2008 compila senza errori

Uno dei tanti estensioni non standard che del compilatore è quello di consentire temporanea rvalues ​​ di essere vincolato ai non-const riferimenti.

Altri tipi (int, double) lavorano

maggior parte degli operatori di estrazione per i tipi fondamentali funzioni membro che può essere chiamato un temporaneo rvalue.

Se ho creo una variabile std::istringstream iss("a"); iss >> c, il compilatore dà nessun errore

iss è un non-temporanea lvalue, in modo che può essere associato a un non const di riferimento.

+0

Ricordo che lo studio visivo ha un'estensione che può associare rvalue a ref non-const lvalue, ma quell'estensione emette un avviso in VS che viene ignorato dal richiedente, credo. Ad ogni modo +1 per una così bella risposta :) –

+0

@ Mr.Anubis: Non ricevo un avviso per questo programma. Non ricevo un avvertimento per 'std :: istringstream & ss = std :: istringstream (" a ");' o –

+0

@ Mr.Anubis: Dopo il tuo commento l'ho compilato di nuovo senza avvisi! Ma dopo aver cambiato il livello di avviso da '/ W3' (che sembra essere predefinito) a'/W4' ho ricevuto un avviso di questo tipo. –

4

La firma per il operator>> leggere un char è

template<class charT, class traits> 
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in,charT& c); 

In base alle regole del linguaggio, un temporaneo non può legarsi al primo parametro come un temporaneo non può legarsi a un riferimento non-const.

Visual Studio 2008 consente questa estensione MS. Le versioni successive ti avviseranno che non è permesso.

Problemi correlati