Adresse von temporärem Objekt



  • Wenn ich eine Vektor-Klasse mit binärem Minus habe:

    D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;
    

    kann ich dann problemlos sowas machen?

    D3DXVECTOR3 dir;
    D3DXVec3Normalize(&dir, &(at-eye));
    

    eye und at sind Vektoren. Es wird kompiliert, aber kann das irgendwie krachen?



  • das sollte so funktionieren, da das rückgabeobjekt erst nach der zeile zerstört wird. hübsch ist es trotzdem nicht. erstell dir doch einen passenden zeiger. der ist optisch schöner, sag aus, was du machst und wird vom compiler eh wegoptimiert.



  • Da der zweite Parameter von D3DXVec3Normalize ein konstanter Zeiger ist, ist dies problemlos möglich. Wäre es ein nicht-konstanter Zeiger, würde zumindest der g++ einen Fehler melden.


  • Mod

    Vekt0r schrieb:

    Wenn ich eine Vektor-Klasse mit binärem Minus habe:

    D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;
    

    kann ich dann problemlos sowas machen?

    D3DXVECTOR3 dir;
    D3DXVec3Normalize(&dir, &(at-eye));
    

    eye und at sind Vektoren. Es wird kompiliert, aber kann das irgendwie krachen?

    Das sollte nicht compilieren, da der unäre operator& ein lvalue als Operand verlangt (wenn er nicht in dieser Klasse überladen wurde). korrekt wäre:

    D3DXVec3Normalize(&dir, &static_cast<const D3DXVec3Normalize&>(at-eye));
    


  • camper schrieb:

    Vekt0r schrieb:

    Wenn ich eine Vektor-Klasse mit binärem Minus habe:

    D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;
    

    kann ich dann problemlos sowas machen?

    D3DXVECTOR3 dir;
    D3DXVec3Normalize(&dir, &(at-eye));
    

    eye und at sind Vektoren. Es wird kompiliert, aber kann das irgendwie krachen?

    Das sollte nicht compilieren, da der unäre operator& ein lvalue als Operand verlangt (wenn er nicht in dieser Klasse überladen wurde). korrekt wäre:

    D3DXVec3Normalize(&dir, &static_cast<const D3DXVec3Normalize&>(at-eye));
    

    😕
    Es kompiliert aber (VS 2005) und die Klasse hat keinen Operator& überladen.



  • camper schrieb:

    da der unäre operator& ein lvalue als Operand verlangt (wenn er nicht in dieser Klasse überladen wurde). korrekt wäre:

    D3DXVec3Normalize(&dir, &static_cast<const D3DXVec3Normalize&>(at-eye));
    

    Der operator- gibt doch ein lvalue zurück 😕


  • Mod

    Bashar schrieb:

    camper schrieb:

    da der unäre operator& ein lvalue als Operand verlangt (wenn er nicht in dieser Klasse überladen wurde). korrekt wäre:

    D3DXVec3Normalize(&dir, &static_cast<const D3DXVec3Normalize&>(at-eye));
    

    Der operator- gibt doch ein lvalue zurück 😕

    D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;
    

    wo siehst du hier ein lvalue?



  • Nirgends, du gewinnst. Der Standard ist da leider etwas inkonsistent.



  • MSVC 2005 frisst es, weil es zu MS' Language Extensions gehört das zu ermöglichen.
    Drehst du die (Language Extensions) aus kannst du dummerweise nichtmal mehr windows.h inkludieren.


Anmelden zum Antworten