eine Klasse Mit einer Referenzhalte ich den folgenden Code miserabel scheitern erwarten würde, aber es kompiliert:Warum kann die Klasse eine Referenz kopierbar halten?
#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;
}
Compiler: g ++ 4.7.2 (mit -std = C++ 11)
Edit: Auch mit-fno-elide-Konstruktoren kompiliert es glücklich
Offenbar wird es verschoben. Es kompiliert nicht, wenn Sie den Move-Konstruktor explizit löschen. – jrok
@jrok Stimmt, aber soweit ich sehen kann, ist es kopierbar und beweglich. – dyp
Interessanterweise würden Sie bei der Architektur der Mill CPU (Security Talk) einen Segmentierungsfehler erhalten. –