co to jest return type of assignment operator?

Dopiero zaczynam C++. Jestem trochę zdezorientowany co do typu powrotu przypisania i operatora dereferencji. Śledzę książkę C++ Primer. Przy różnych okazjach autor mówi, że return type of assignment operator jest odniesieniem do typu operandu lewej ręki, ale później mówi, że return type jest typem operandu lewej ręki. Odnoszę się do standardu C++11 sec. 5.17, gdzie Typ powrotu jest opisany jako " lvalue refering to left hand operand".

Podobnie, Nie mogę dowiedzieć się, czy dereferencja zwraca wskazywany obiekt, czy odniesienie do obiektu.

Czy te stwierdzenia są równoważne? Jeśli tak, to jak? Każde Wyjaśnienie będzie mile widziane.

Author: rahul1210, 2013-03-08

3 answers

Standard poprawnie definiuje typ zwracanego operatora przyporządkowania. W rzeczywistości sama operacja przypisania nie zależy od wartości zwrotu - dlatego Typ zwrotu nie jest łatwy do zrozumienia.

Typ powrotu jest ważny dla operacji łączenia łańcuchów. Rozważ następującą konstrukcję: a = b = c;. To powinno być równe a = (b = c), tzn. c powinno być przypisane do b i b do a. Przepisz to jako a.operator=(b.operator=(c)). W celu przypisania do a do poprawne działanie typ powrotu b.operator=(c) musi być odniesieniem do wewnętrznego wyniku przypisania (będzie działać również z kopią, ale to tylko zbędny narzut).

Typ Return operatora dereferencji zależy od twojej wewnętrznej logiki, zdefiniuj go w sposób, który odpowiada twoim potrzebom.

 20
Author: SomeWittyUsername,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 11:41:05

Mogą być czymkolwiek, ale zazwyczaj operator = zwraca bieżący obiekt przez odniesienie, tzn.

A& A::operator = ( ... )
{
   return *this;
}

I tak, "odniesienie do typu operandu lewej ręki" i "lvalue odnoszące się do operandu lewej ręki" oznaczają to samo.

Operator dereferencji może mieć w zasadzie dowolny typ powrotu. Zależy to głównie od logiki programu, ponieważ przeciążasz operatora, który odnosi się do obiektu, a nie do wskaźnika do obiektu. Zwykle jest to używane do inteligentnych pointers, or iterators, and return the object they wrap around:

struct smart_ptr
{
   T* innerPtr;
   T* smart_ptr::operator* ()
   {
      return innerPtr;
   }
}

smart_ptr p; 
T* x = *p;  
 8
Author: Luchian Grigore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 11:30:13

Widziałem podobne problemy, ale chyba najlepiej byłoby użyć

X& X::operator=(const X&);

Używając tego, będziesz mógł ponownie użyć obiektu w przypisaniu łańcucha.

 1
Author: bash.d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 11:30:46