2015-04-20 9 views
7

Po wypróbowaniu napisać przykład dotyczące konstruktorów poruszać, wpadłem na następujący kod:Przenieś konstruktor nie nazwie

#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; 
} 

Dlaczego nie konstruktor ruch zwany tutaj? drukuje programowe:

dane()

Co mam ze znalezieniem nawet dziwniejsze jest to, że przez dodanie konstruktor kopiujący, nagle robi wywołać konstruktor ruch .. .

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

A teraz będzie drukować

danych (& &)

P.S Używam gcc 4.4.5

+1

Dziwne ... Jestem pod ubuntu, GCC 4.8. Wywołuje konstruktor ruchu. Jakiego kompilatora używasz? –

+1

To samo tutaj (konstruktor ruchu jest wywoływany poprawnie), z gcc 4.7.2. – CAdaker

+4

To [robi] (https://ideone.com/CS5LC3) zostaje wywołane. Jaki jest twój kompilator i którą wersję? – edmz

Odpowiedz

9

Cóż, Twój kod działa prawidłowo dla mnie. See this sample.

wyjściowa:

Data() 
Data(&&) 
4 

Standardowo mówi:

Konstruktor ruch jest wywołana, kiedy obiekt jest inicjowana z xvalue tego samego rodzaju, zawierającego

  • inicjalizacja, T a = std::move(b); lub T a(std::move(b));, gdzie b jest typu T
  • funkcji mijania argumentu: f(std::move(a));, gdzie a jest typu T i f jest void f(T t)
  • powrotną: return a; wewnątrz funkcji, takich jak T f(), gdzie a jest typu T, który posiada przenieś konstruktora.

I

std::move uzyskuje odwołanie rvalue do swojej argumentacji i konwertuje go do xvalue.

Nie widzę powodu dla zachowania, które opisujesz. Być może coś jest nie tak z twoim kompilatorem?


EDIT

Wydaje się, że jest to rzeczywiście wina kompilatora. Definicja funkcji ruchu została opisana w propozycji N3053 ("Definiowanie funkcji przenoszenia specjalnych funkcji użytkownika"). Jak widzimy w tabeli na this page:

enter image description here

3

Kod jest dobrze wykształcona i powinny wywołać konstruktor ruch. Jednak gcc 4.4 nie obsługuje definiowania funkcji przenoszenia zgodnie z podanym here.

Chcesz rozważyć aktualizację kompilatora.