2016-07-04 8 views
5

studierte ich, dass das Format der Bedienfunktionen istSonderbare Überladen von Operatoren, "Operator T &() const noexcept {return * _ptr;}"

(return value)operator[space]op(arguments){implementation} 

Aber in std::reference_wrapper Implementierung gibt es eine Bedienfunktion deklarierte Überlastung als operator T&() const noexcept { return *_ptr; }.

Ist dieser Operator anders als T& operator() const noexcept { return *_ptr; }?. Wenn beide verschieden sind, was nützt dann der erste?

+0

Ich frage, was die Syntax zum Erstellen von Casting ist (wie in C# ist es unheimlich ähnlich) –

+0

das Format ist für Konvertierungsoperatoren unterschiedlich. –

Antwort

11

operator T&() const noexcept; ist ein user-defined conversion function. std::reference_wrapper hat es zu geben, um Sie mit der gespeicherten Referenz zuzugreifen, ohne die Syntax zu ändern:

int x = 42; 
int &a = x; 
std::reference_wrapper<int> b = x; 

std::cout << a << " " << b << std::endl; 

Assignment is a little bit trickier.


T& operator() const noexcept; ist ein Versuch, operator() zu erklären, aber nicht wegen der fehlenden Parameterliste zu kompilieren. Die richtige Syntax wäre:

T& operator()() const noexcept; 
//   ^
//  parameters here 

und die usage is completely different.

Verwandte Themen