Po prostu spędziłem nadmierną ilość czasu, błądząc z błędem kompilacji w Visual Studio. Destylowałem kod do małego przykładu poniżej i próbowałem go na IdeOne i otrzymałem ten sam błąd, który można zobaczyć here.Dlaczego ten kod próbuje wywołać konstruktora kopiowania?
Zastanawiam się, dlaczego następujący kod próbuje zadzwonić B(const B&)
zamiast B(B&&)
:
#include <iostream>
using namespace std;
class A {
public:
A() : data(53) { }
A(A&& dying) : data(dying.data) { dying.data = 0; }
int data;
private:
// not implemented, this is a noncopyable class
A(const A&);
A& operator=(const A&);
};
class B : public A { };
int main() {
B binst;
char* buf = new char[sizeof(B)];
B* bptr = new (buf) B(std::move(binst));
cout << bptr->data << endl;
delete[] buf;
}
nie wyraźnie określa żadnych konstruktorów, więc B(std::move(binst))
powinien zadzwonić kompilator generowane B(B&&)
, nie?
Kiedy zmienić B
do
class B : public A {
public:
B() { }
B(B&&) { }
};
To kompiluje grzywny. Dlaczego to?
Będzie bardzo niewygodne, jeśli nie można go naprawić z klasy bazowej, ponieważ mam klasę szablonów, która używa nowych miejsc i przenosi konstruktorów, takich jak przykład, i będzie wymagać każdej klasy, która nie jest kopiowalna (co jest nie, zdecydowanie nie powinno być wymogiem do użycia z moją klasą szablonów), aby mieć jawnie zdefiniowany konstruktor ruchu.
Czy jest wygenerowany kompilator B (B &&)? Moje C++ 11 jest wciąż trochę zardzewiałe. I czy twoja B (B &&) musi zainicjować A (A &&)? – CashCow
@CashCow tak, wszystko co robi to przesuwanie każdego członka (jeśli jest źle, to patrzę na ciebie, Kerrek SB ':)') –
Kompiluje się dobrze na GCC 4.6, GCC 4.7 i Clang 3.0. –