2015-01-21 18 views
27

Recentemente ho letto attraverso la API of boost::optional ed ho trovato le linee:const &, & e && specificazioni per le funzioni di membro in C++

T const& operator *() const& ; 
T&  operator *() & ; 
T&&  operator *() && ; 

Ho anche scritto il mio programma che definisce le funzioni membro come const &, & e & & (Nota che non sto parlando del tipo di ritorno, ma degli specificatori poco prima del punto e virgola) e sembrano funzionare bene.

so cosa vuol dire dichiarare una funzione const membro, ma chiunque può spiegare cosa significa dichiarare const &, & e & &.

+1

In che modo non è un duplicato più di 6 anni dopo l'avvio di Stack Overflow? –

risposta

20

const& significa che questo overload verrà utilizzato solo per oggetti const, non-const e lvalue.

const A a = A(); 
*a; 

& mezzi, che questo sovraccarico sarà utilizzato soltanto per oggetto non const.

A a; 
*a; 

&& mezzi, che questo sovraccarico sarà utilizzato soltanto per oggetto rvalue.

*A(); 

per ulteriori informazioni su questa caratteristica del C++ 11 standard potete leggere questo post What is "rvalue reference for *this"?

+5

Se aiuta, mi piace pensare a questi qualificatori come applicabili all'oggetto '* this' che è" segretamente "passato come primo argomento di metodi. –

+4

'const &' e '&' significano che saranno usati per un 'const' e non-'const' * lvalue *. '&&' sarà usato solo per un valore, non necessariamente un riferimento. – Angew

+0

@Angew grazie, corretto. – ForEveR

18

Si tratta di funzioni membro ref-qualificazioni, è una delle caratteristiche aggiunte in C++ 11. È possibile sovraccaricare le funzioni membro non statiche in base al fatto che il parametro implicito this è un lvalue o un valore rval specificando un qualificatore di qualificazione di funzione (some details).

Per specificare un qualificatore di riferimento per una funzione membro non statico, è possibile qualificare la funzione con & o &&.

#include <iostream> 
struct myStruct { 
    void func() & { std::cout << "lvalue\n"; } 
    void func() &&{ std::cout << "rvalue\n"; } 
}; 

int main(){ 
    myStruct s; 
    s.func();   // prints "lvalue" 
    std::move(s).func(); // prints "rvalue" 
    myStruct().func(); // prints "rvalue" 
} 
Problemi correlati