2016-11-19 1 views
-3

nach der Post r-value causes a warning without the use of std::move, Ich frage mich, ob der folgende Code Verhalten nicht definiert hat, hat:Enthält der folgende Code Verhalten undefiniert aufgrund r-Wert Verwendung

struct Animal 
{ 
    virtual void foo() const 
    { 
    std::cout << "error" << std::endl; 
    } 
}; 

struct Dog : public Animal 
{ 
    void foo() const 
    { 
    std::cout << "wuff" << std::endl; 
    } 
}; 

struct A 
{ 
    A(const Animal& a) : _a(a) {} 

    void foo() 
    { 
    _a.foo(); 
    } 


    const Animal& _a; 
}; 

int main() 
{ 
    A a(Dog{}); 
    a.foo(); 

} 

Auf meinem Rechner ist der Ausgang (wie erwartet) wuff.

Antwort

4

Tatsächlich ist a.a_ eine freie Referenz in der Anweisung a.foo();, und so hat die Auswertung des Ausdrucks _a.foo undefiniertes Verhalten. Die Lebensdauer des temporären Objekts Dog{} endet am Ende des vollständigen Ausdrucks (und ist nicht erweitert).

+0

Kennen Sie eine Lösung oder einen Workaround? –

+0

@abraham_hilbert: Nimm den Wert mit const Zeiger: 'A (const Animal * p): a _ (* p) {}'. Das macht es * viel * schwerer, versehentlich die Adresse von prvalue zu übergeben. –

Verwandte Themen