Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

wykoanie const_cast na zmiennych tymczasowych

Ostatnio zmodyfikowano 2015-07-11 14:08
Autor Wiadomość
b00rt00s
Temat założony przez niniejszego użytkownika
wykoanie const_cast na zmiennych tymczasowych
» 2015-07-10 13:58:19
Mam taki kod:
C/C++
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?
P-134547
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.
P-134551
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.
P-134553
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.
P-134569
« 1 »
  Strona 1 z 1