Avere una classe che tiene un riferimento ci si aspetterebbe il seguente codice sicuro misero, ma compila:Perché la classe contiene un riferimento copiabile?
#include <iostream>
struct ReferenceHolder
{
std::string& str;
ReferenceHolder(std::string& str)
: str(str)
{}
};
// Why does this compile?
ReferenceHolder f() {
std::string str = "Hello";
return ReferenceHolder(str);
}
int main() {
ReferenceHolder h = f();
std::cout << "Should be garbage: " << h.str << '\n';
return 0;
}
compilatore: g ++ 4.7.2 (con -std = C++ 11)
Modifica: Perfino con costruttori -fno-elide che compila felicemente
Apparentemente viene spostato. Non si compila se si cancella esplicitamente il costruttore di mosse. – jrok
@jrok Vero, ma per quanto posso vedere è sia copiabile che mobile. – dyp
È interessante notare che, in base alla presentazione della CPU Mill (Security talk), su questa architettura si otterrebbe un errore di segmentazione. –