2016-07-04 18 views
5

Uczyłem się, że format funkcji operatorskich jestWeird operatora przeciążanie, "operator T &() const noexcept {return * _ptr;}"

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

ale w std::reference_wrapper realizacji, istnieje operator funkcji przeciążenia uznanej jako operator T&() const noexcept { return *_ptr; }.

Czy ten operator różni się od T& operator() const noexcept { return *_ptr; }?. Jeśli oba są różne, to jaki jest pożytek z pierwszego?

+0

Pytam, jaka jest składnia tworzenia castingu (jak w C# jest niesamowicie podobny do tego) –

+0

format jest inny dla operatorów konwersji. –

Odpowiedz

11

operator T&() const noexcept; to user-defined conversion function. std::reference_wrapper ma to, aby dać Ci dostęp do przechowywanej odniesienia, bez zmiany składni:

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; jest próbą zadeklarować operator(), ale nie skompilować z powodu braku listy parametrów. Prawidłowa składnia to:

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

i usage is completely different.

Powiązane problemy