Che cosa so
So che restituire un riferimento const di un oggetto temporaneo è ok! (Come in questo esempio :)return const riferimento della sottoclasse
class A {
public:
virtual const A& clone() { return (A()); }
virtual std::string name() const { return ("A"); }
};
Returning temporary object and binding to const reference
Ma!
Se vorrei farlo, è ancora corretto:
class B : public A {
public:
virtual const A& clone() { return (B()); }
virtual std::string name() const { return ("B"); }
};
Vorrei pensare di sì, ma in tempo di esecuzione, l'oggetto restituito è ancora considerato come un un oggetto (come in questo esempio:)
main.cpp
#include <iostream>
#include <string>
int main() {
B bb;
A* aa = &bb;
std::cout << aa->clone().name() << std::endl;
}
uscita
valgrind ./a.out
==14106== Use of uninitialised value of size 8
==14106== at 0x401BF9: main (main.cpp:8)
==14106== Uninitialised value was created by a stack allocation
==14106== at 0x401BF2: main (main.cpp:8)
B
Si tratta di un B .. yay .. ma questo avvertimento è abbastanza horrifing ....
Modifica
Grazie a te so vedere il mio errore ... ma vorrei sapere alcune altre cose a proposito ...
Quando viene eseguito, cosa accade esattamente nello stack?
@Chris Drew ... errrh Non capisco – CollioTV
"So che restituire un riferimento const di un oggetto temporaneo è ok!" No, non lo è. –
http://stackoverflow.com/questions/11560339/returning-temporary-object-and-binding-to-const-reference "Questa è una funzionalità in C++ Il codice è valido e fa esattamente ciò che sembra fare.", "C++ specifica deliberatamente che legare un oggetto temporaneo a un riferimento a const sullo stack allunga la vita del temporaneo alla durata del riferimento stesso" – CollioTV