Co oznacza operator ampersand po tym przypisaniu?

Czytałam to Ładna odpowiedź odnośnie "zasady pięciu" i zauważyłam coś, czego wcześniej nie widziałam:

class C {
  ...
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  ...
};

Jaki jest cel znaku & umieszczonego przed = default dla operatora przyporządkowania kopii i dla operatora przyporządkowania ruchu? Czy ktoś ma referencje do tego?

Author: Community, 2012-09-06

2 answers

Jest częścią funkcji pozwalającej C++11 niestatycznych funkcji prętowych na rozróżnienie, czy są one wywoływane na lvalues czy rvalues.

W powyższym przypadku operator przypisania kopii, który jest tutaj niewykonany, może być wywołany tylko na lvalues. Używa reguł dla lvalue i rvalue reference bindings, które są dobrze ugruntowane; to tylko ustanawia je dla this.

W powyższym przypadku operator przypisania kopii jest domyślnie ustawiony tylko wtedy, gdy kopiowany obiekt into może wiązać się z referencją non-const lvalue. Więc to jest w porządku:

C c{};
c = C{};

To nie jest:

C{} = c;

Tymczasowy tutaj nie może wiązać się z referencją lvalue, a zatem operator przypisania kopii nie może być wywołany. A ponieważ ta deklaracja uniemożliwi utworzenie zwykłego operatora przypisywania kopii, składnia ta skutecznie zapobiega przypisywaniu kopii (lub przenoszeniu) do tymczasowych . Aby to przywrócić, musisz dodać && version:

C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
 36
Author: Nicol Bolas,
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
2012-09-06 18:54:55

Oznacza to, że funkcja ta może być wywołana tylko na lvalues. To się nie powiedzie, ponieważ funkcja operatora przyporządkowania jest wywoływana na wyrażeniu obiektu rvalue:

C() = x;
 13
Author: Johannes Schaub - litb,
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
2012-09-06 18:35:59