nicht

2015-04-20 10 views
7

Nach dem Versuch, ein Beispiel in Bezug auf Bewegung Konstrukteurs Verschieben Konstruktor aufgerufen zu schreiben, lief ich in den folgenden Code:nicht

#include <utility> 
#include <iostream> 

using namespace std; 

class Data 
{ 
public: 
    Data() 
    : x (3) 
    { 
     cout << "Data()" << endl; 
    } 
    Data(Data&&) 
    : x(4) 
    { 
     cout << "Data(&&)" << endl; 
    } 

int x; 
}; 

int main() 
{ 
    Data a; 
    Data b (std::move(a)); 
    cout << b.x << endl; 
    return 0; 
} 

der Umzug Konstruktor hier nicht genannt Warum? Das Programm druckt:

Daten()

Was ich finde, ist noch seltsamer, dass eine Kopie Konstruktor durch Hinzufügen, plötzlich, es den Umzug Konstruktor tut nennen ..

.
Data(const Data&) 
    : x(2) 
    { 
     cout << "Data(copy)" << endl; 
    } 

Und jetzt wird es drucken

Daten (& &)

P. S Ich bin gcc 4.4.5

+1

Seltsam ... Ich bin unter ubuntu, GCC 4.8. Es ruft den Move-Konstruktor auf. Welchen Compiler benutzen Sie? –

+1

Gleiches hier (move Konstruktor wird richtig aufgerufen), mit gcc 4.7.2. – CAdaker

+4

Es [does] (https://ideone.com/CS5LC3) wird aufgerufen. Was ist dein Compiler und welche Version? – edmz

Antwort

9

Nun verwenden, funktioniert der Code für mich richtig. See this sample.

Output:

Data() 
Data(&&) 
4 

Serienmäßig sagt:

Der Umzug Konstruktor aufgerufen wird, wenn ein Objekt aus xValue desselben Typs initialisiert wird, die

    umfasst
  • Initialisierung, T a = std::move(b); oder T a(std::move(b));, wo b vom Typ T
  • Funktionsargument pass: f(std::move(a));, wobei A vom Typ T und fvoid f(T t)
  • Funktionsrückgabe ist: return a; innerhalb einer Funktion wie T f(), wobei A vom Typ T, die a hat Konstruktor verschieben

Und

std::move erhält einen rvalue Bezug auf ihr Argument und wandelt es in ein xValue.

Ich sehe keinen Grund für das Verhalten, das Sie beschreiben. Vielleicht stimmt etwas mit Ihrem Compiler nicht?


EDIT

Es scheint, dass es in der Tat die Schuld des Compilers ist. Die Definition der Bewegungsfunktionen wurde im Vorschlag N3053 ("Definieren von Sonderfunktionen für Mitglieder verschieben") beschrieben. Wie können wir auf this page in der Tabelle sehen:

enter image description here

3

Ihr Code ist gut ausgebildet und sollte den Umzug Konstruktor aufrufen. Gcc 4.4 unterstützt jedoch nicht die Definition von Bewegungsfunktionen wie angegeben here.

Sie möchten Ihren Compiler aktualisieren.