Considerare questo codice:copie spurie 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;
}
compilata in gcc con -std = C++ 11 e si ottiene l'uscita,
Param
Default
Assignment
Rimuovere -STD = C++ 11, poi si arriva,
Param
Default
Copy
Copy
Assignment
libc++ example producing the superior output in c++03 mode
Dove sono le due copie in più provenienti da?
Sono relativi alla chiamata dell'operatore di pedice, non all'assegnazione. (Rimangono se rimuovi il compito). Per me non sembrano essere necessari, nemmeno in un mondo pre-C++ 11, come mostra l'esempio di libC++.
Questo è stato originariamente motivato, cercando in this question
non si ottiene loro in modalità C++ 11 quindi perché non rimuovere tutte le funzioni rvalue-ref dalla questione del tutto? La domanda non è ovviamente influenzata da loro. –
Mi aspetto che questa sia una cosa di QoI all'interno di libstdC++ e suppongo che ci vorrebbe qualche cosa per determinare con precisione cosa sta succedendo. –
@LightnessRacesinOrbit Sono lì perché la domanda non è influenzata da loro, in contraddizione con la risposta precedente. – tahsmith