Otrzymałem dziwny błąd z gcc i nie mogę zrozumieć dlaczego. Zrobiłem poniższy przykład kodu, aby problem był bardziej przejrzysty. Zasadniczo istnieje zdefiniowana klasa, dla której konstruktor kopii i operator przypisania kopii są prywatni, aby zapobiec ich przypadkowemu wywołaniu.vector :: push_back nalega na użycie konstruktora kopiowania, chociaż konstruktor ruchu jest dostarczany
#include <vector>
#include <cstdio>
using std::vector;
class branch
{
public:
int th;
private:
branch(const branch& other);
const branch& operator=(const branch& other);
public:
branch() : th(0) {}
branch(branch&& other)
{
printf("called! other.th=%d\n", other.th);
}
const branch& operator=(branch&& other)
{
printf("called! other.th=%d\n", other.th);
return (*this);
}
};
int main()
{
vector<branch> v;
branch a;
v.push_back(std::move(a));
return 0;
}
Oczekuję, że ten kod się skompiluje, ale nie powiedzie się z gcc. W rzeczywistości gcc skarży się, że "branch branch" (const branch &) jest prywatne ", co, jak rozumiem, nie powinno być wywoływane.
Operator przypisania działa, ponieważ jeśli wymienić korpus główny() z
branch a;
branch b;
b = a;
będzie opracować i prowadzony, jak oczekiwano.
Czy to jest prawidłowe zachowanie gcc? Jeśli tak, to co jest nie tak z powyższym kodem? Każda sugestia jest dla mnie pomocna. Dziękuję Ci!
Działa dla mnie z gcc-4.6.1. –
Używałem gcc 4.7.1-2. Spróbuję 4.6.1. Dzięki! – BreakDS
Po przeczytaniu N3242, ten kod powinien być dozwolony (ale jeśli konstruktor ruchu wyrzuci wyjątek, program ma niezdefiniowane zachowanie). – aschepler