2015-02-18 8 views
5

Natknąłem sytuacji, gdy jest w stanie łańcucha wywołanie metody zmiennej czasowej byłoby bardzo pomocne:Czy referencja zwrócona ze zmiennej tymczasowej jest ważna?

draw(Quad(0, 0, 1, 1).rotate(90)); // <-- .rotate() returns a Quad reference 

struct Quad{ 
    Quad(float x, float y, float width, float height){...} 
    Quad & rotate(float degrees){ 
     ... 
     return *this; 
    } 
} 

Jednak jestem pewien, czy zmienna tymczasowa pozostanie przy życiu wystarczająco długo dla draw() funkcja do korzystania z niego. Czy to jest bezpieczne?

+0

Duplikat http://stackoverflow.com/questions/584824/guaranteed-lifetime-of-temporary-in-c- –

Odpowiedz

12

To szczególne zastosowanie jest bezpieczne. Czasowy trwa do końca pełnego wyrażenia, które je tworzy: ; tutaj pełnym wyrażeniem jest całe oświadczenie, w tym wezwanie do draw.

Generalnie ten wzór może być niebezpieczny. Poniżej podano niezdefiniowane zachowanie:

Quad & rotated = Quad(0, 0, 1, 1).rotate(90); 
draw(rotated); 

W mojej opinii wolałbym, aby typ był niezmienny; zamiast wywoływania funkcji modyfikacji istniejącego obiektu, wywołaj funkcję const, aby zwrócić nowy obiekt, pozostawiając istniejący obiekt w stanie nienaruszonym.

chyba że jest związany bezpośrednio do odniesienia, która rozciąga się jej żywotność odpowiednio do wartości zadanej. Nie dotyczy to tutaj, ponieważ nie jest bezpośrednio związana.

+1

Podoba mi się twoja odpowiedź lepiej niż moja, ponieważ udało ci się podać konkretną sugestię, jak pisać lepsza klasa, coś, z czym nie mogłem sobie poradzić. Pójdźmy z twoją. :) – hvd

+0

Nie myślałem o tym scenariuszu, dziękuję za złapanie go! –

+0

Zgadzam się. Ale czy ten sam wzór nie jest konwencją z operatorami przypisania? Jeśli ten wzór jest niebezpieczny, czy oznacza to, że operatorzy przypisania są niebezpieczni z tego samego powodu? –

6

Tak, tymczasowy Quad jest niszczony na końcu pełnego wyrażenia (kończąc ;). Więc wciąż żyje, kiedy wywołujesz na nim rotate i wciąż żyje, kiedy wywołujesz jako parametr parametr draw.

Powiązane problemy