2013-07-08 12 views
6
struct CCompare 
{ 
    const bool operator()(const int& lhs, const int& rhs) const { 
     return lhs < rhs; 
    } 
}; 

Attenzione C4180 1 avvertimento: qualificatore Riferito alla funzione di tipo non ha alcun significato ;ritorno del `bool` const provoca avviso C4180

Ho visto l'utilizzo con il valore restituito come const bool in un libro di programmazione. Quando ho compilato il codice sopra con vs2010, riporta l'avviso C4180.

Il seguente codice invece non causerà lo stesso avviso.

struct CCompare 
{ 
    bool operator()(const int& lhs, const int& rhs) const { 
     return lhs < rhs; 
    } 
}; 

Question1> E 'vero che l'uso di const Fundamental_Data_Types in funzione restituito il valore non ha senso?

Question2> E 'vero che l'uso di const Type come un valore restituito funzione ha senso solo se e solo se il tipo è una classe/struct?

Grazie

// // Aggiornamento

struct CClass 
{ 
    int val; 
    CClass(int _val) : val(_val) {} 

    void SetValue(int _val) { 
     val = _val; 
    } 
}; 

struct CCompare 
{ 
    const CClass getMe() const { 
     return CClass(10); 
    } 

    CClass getMeB() const { 
     return CClass(10); 
    } 
}; 

int main(/*int argc, char *argv[]*/) 
{ 
    CCompare c; 

    c.getMe().SetValue(20); // error 
    c.getMeB().SetValue(20); // ok 
} 
+4

In entrambi i casi, il valore di ritorno viene copiato nel chiamante. Non hai il diritto di far rispettare 'const' su un valore copiato che stanno tornando. – chris

+4

'const' ha senso solo se si restituisce un riferimento o un puntatore, indipendentemente dal fatto che si tratti di una classe/struct o di un tipo fondamentale. –

+0

vc2012 nessun avviso. – Jichao

risposta

7

Sì e sì ad entrambe le vostre domande. I valori di ritorno sono i valori di ei qualificatori di cv si applicano solo ai rvalue se hanno un tipo di classe .

La ragione di questo è abbastanza semplice: non c'è niente di solito si può fare con un rvalue dove const-ness farebbe la differenza — è un valore, dopo tutto, e non un oggetto. Con un tipo di classe, ci sono funzioni membro da prendere nell'account (il che significa che è possibile ottenere un lvalue dal valore ), quindi la costanza diventa improvvisamente rilevante.

+0

Puoi spiegare perché i qualificatori di cv si applicano solo ai rvalue? 'const int leftValue = 10'. Qui il 'const' è applicato ad un lvalue. Suppongo di aver frainteso il tuo punto. – q0987

+0

@ q0987 Mi stai fraintendendo. 'const' può essere applicato a tutti i lvalue. Può essere applicato a rvalues ​​solo se hanno un tipo di classe. –

Problemi correlati