wykoanie const_cast na zmiennych tymczasowych
Ostatnio zmodyfikowano 2015-07-11 14:08
b00rt00s Temat założony przez niniejszego użytkownika |
wykoanie const_cast na zmiennych tymczasowych » 2015-07-10 13:58:19 Mam taki kod: class A { public: A() = default; A( A & ) = default; A( A && ) = default; A & operator =( A & ) = default; A & operator =( A && ) = default; };
class B { public: A a; };
void test( const B & b1 ) { B b2; B & b1_no_const = const_cast < B &>( b1 ); b2.a = std::move( b1_no_const.a ); }
int main( int argc, char * argv[] ) { test( B() ); return 0; } Kompiluje się i działa, ale... to jeszcze nie znaczy, że jest poprawny. Pytanie brzmi: czy wykonanie rzutowania mającego na celu usunięcie modyfikatora const w funkcji test i przeniesienie wartości zmiennej składowej jest poprawne? Czy nie powoduje to przypadkiem zachowania niezdefiniowanego? Zależy mi szczególnie na przypadku, gdy zmienna przekazana do funkcji jest zmienną tymczasową. Wiem, ze jest to wydumany przykład i generalnie jest to brzydka praktyka. Jednakże napisałem sobie pewien szablonowy kod, w którym akurat podobny zabieg byłby celowy. Kod ten się kompiluje i działa... no właśnie... ale czy jest poprawny? |
|
Monika90 |
» 2015-07-10 15:23:34 Moim zdaniem to jest poprawne, nie ma jednak żadnego powodu by taki kod pisać. Naprawdę, przeprojektuj swój program, tak by takie coś nie było konieczne. |
|
b00rt00s Temat założony przez niniejszego użytkownika |
» 2015-07-10 15:53:20 Tak wiem, wydaje się to dziwne, ale... piszę sobie kod, który jest dla mnie tylko edukacyjnym eksperymentem i wydaje mi się, że to jest konieczne. Spróbuję ten program jednak przerobić. To nie jest tak, że ja się przy tym upieram, ale innego rozwiązania na razie nie znajduję. Może jak wrócę z weekendu to założę na forum nowy wątek i pokażę ten kod. Sam muszę go jednak przemyśleć ;).
[EDIT]
Oczywiście, po przemyśleniu, ten trick nie był mi do niczego potrzebny. Wystarczyło, aby w miejscu, w którym użyłem stałej referencji użyć referencji do r-wartośći :D. Nie wiem jak na to mi to umknęło, ale i tak warto się dowiedzieć, czy takie triki są możliwe. |
|
pekfos |
» 2015-07-11 14:08:48 Z poziomu funkcji nie wiadomo, czy przekazany obiekt jest tymczasowy, czy nie. To referencja na stałą, a przeniesienie jest potencjalnie destrukcyjnym kopiowaniem, a więc potencjalnie modyfikacją stałej. W tym przypadku może to być poprawne, bo przeniesienie nic nie robi. W ogólnym przypadku - zachowanie niezdefiniowane. |
|
« 1 » |