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?
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;
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;
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