Być może zadaję głupie pytanie, ale spojrzałem na stronę wikipedia dla RVO here i nie mogłem przestać się zastanawiać, czy to zachowanie jest złe. Próbowałem go w mojej maszynie, a RVO zostało w pełni wyrzucone pomimo optymalizacji. A co, jeśli rzeczywiście coś się stało w konstruktorze? Wiem, że nie powinno, ale co jeśli? Nie mogę zrozumieć, dlaczego RVO nadal miałoby miejsce, gdyby w konstruktorze wystąpiły efekty uboczne.Czy optymalizacja wartości zwracanej (RVO) nie jest błędem?
EDYCJA: -fno-elide-constructors
wydaje się zatrzymać RVO. Ale pozostaje pytanie.
EDIT2: Co ważniejsze, ile osób wie o czymś takim? Być może w standardzie, ale jest to wciąż bardzo brzydka funkcja, jaką widzę. Przynajmniej kompilatory powinny domyślnie go wyłączyć i zapewnić przełącznik dla osób, które o tym wiedzą. :)
EDYCJA 3: Nadal twierdzę, że jest naprawdę źle. :). Nie sądzę, abym znał jakiekolwiek inne ograniczenia językowe, takie jak te, które są sprzeczne ze składnią języka. Wszystko inne powoduje błędy kompilatora lub linkera?
Osobiście uważam, że RVO jest obrzydliwość. –
Czy możesz wymyślić dobry przypadek użycia dla nietrywialnych efektów ubocznych w konstruktorze kopii? Nie mam jednego, bez pomocy. Zwykle są one nazywane za kulisami i naprawdę łatwo popełnić błąd, gdy zastanawiają się, kiedy zostaną wezwani. To dla mnie jest bardzo dobry powód, aby zostawić efekty uboczne. –
Nie mam żadnego powodu, aby umieszczać efekty uboczne wewnątrz konstruktora kopiowania. :) – nakiya