diesen Code vor:Unechte Kopien in C++ 03 libstdC++ vs C++ 11
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Foo
{
public:
Foo() : _x(0)
{
cout << "Default" << endl;
}
Foo(int a) : _x(a)
{
cout << "Param" << endl;
}
Foo(Foo const &foo) :
_x(foo._x)
{
cout << "Copy" << endl;
}
Foo& operator=(Foo const &foo)
{
cout << "Assignment" << endl;
_x = foo._x;
return *this;
}
int get(void)
{
return _x;
}
private:
int _x;
};
int main(int argc, char *argv [])
{
std::map<int, Foo> foos;
Foo a_foo(10);
foos[100] = a_foo;
return 0;
}
Zusammengestellt in gcc mit -std = C++ 11 und Sie die Ausgabe erhalten,
Param
Default
Assignment
Remove -std = C++ 11, dann erhalten Sie,
Param
Default
Copy
Copy
Assignment
libc++ example producing the superior output in c++03 mode
Wo sind die beiden kommen zusätzliche Kopien?
Sie beziehen sich auf den Aufruf des Subscript-Operators, nicht die Zuweisung. (Sie bleiben, wenn Sie die Aufgabe entfernen.) Für mich scheinen sie selbst in einer Welt vor C++ 11 nicht benötigt zu werden, wie das Beispiel libC++ zeigt.
Das ursprünglich durch einen Blick auf this question
Sie erhalten sie nicht in C++ 11-Modus so, warum alle nicht entfernen Sie die R-Wert-ref Funktionen von der Frage vollständig? Die Frage wird von ihnen offensichtlich nicht berührt. –
Ich erwarte, dass dies eine QoI-Sache innerhalb von libstdC++ ist und rate mal, dass es etwas dauern würde, um sinnlos genau festzustellen, was vor sich geht. –
@LightnessRacesinOrbit Sie sind da, denn die Frage wird von ihnen nicht beeinflusst, im Widerspruch zu der früheren Antwort. – tahsmith