Pytanie Czy istnieje jakiś ważny powód, aby nie zwracać * tego z operatora przypisania kopii? [duplikować]


To pytanie już zawiera odpowiedź:

Pozwolić foo być strukturą lub klasą z operatorem przypisania kopii:

struct foo {
    foo &operator=(const foo &);  // or with some other return type?
};

Jest tu zawsze rozsądny powód do zwrotu czegoś innego niż *this z operator=()? Używanie go do czegoś niezwiązanego z zadaniami nie kwalifikuje się jako rozsądne.


11
2018-05-20 21:34


pochodzenie


Kiedy wrócisz this*, pozwalasz, aby operator przypisania był połączony łańcuchowo i = j = k = .... Możesz zwrócić inne rzeczy, ale jak przydatne będzie to w oparciu o twoje definicje i sposób, w jaki chcesz, aby twoje klasy były używane - Alex
Szablony wyrażeń. - Alan Stokes
@AlanStokes Byłoby miło, gdybyś to rozwinął, wiesz. - Marius Bancila
ciekawe pytanie, ale dlaczego pytasz? Czy to naprawdę jest praktyczne, szczegółowe pytanie? Następnie spróbuj to pokazać. - Wolf
uwaga: odpowiedzi na duplikat badają różne scenariusze, gdzie *this nie jest zwracane - M.M


Odpowiedzi:


Przykład ze standardu to std::atomic. Zwraca przypisaną wartość. Jeśli zwrócono referencję, odczytanie jej może dać inny wynik.


9
2018-05-20 21:44



Czy znasz inne przykłady? - Wolf
@Wolf: Boost :: Phoenix to biblioteka do tworzenia leniwych wyrażeń. Więc operator=() zwróciłby jakiś przedmiot, który mógłbyś wywołać operator()() aby faktycznie wykonać zadanie. - Bill Lynch
@BillLynch to chyba to, o czym wspomniał Alan Stokes? - Wolf


Jeśli chcesz zapobiec przypisywaniu łańcucha.

Czasami miło jest zapobiec takim wyrażeniom:

x = y = z = a = b = c = d = foo{15};

Sprawiasz, że operator przypisania zwraca nieważny.

struct foo {
    void operator=(const foo &);
};

Dla niektórych typów łańcuchowanie nie ma sensu. Ale musisz na to spojrzeć w każdym przypadku.


0
2018-05-20 22:44