Wygląda na to, że dodanie domyślnego konstruktora uniemożliwia wywołanie emplace_back
i generuje komunikat o błędzie: "Asercja statyczna nie powiodła się: typ nie jest możliwy do przypisania" (gcc 5.3 z opcją -std = C++ 14). Oto prosty kod, który ilustruje problem:Domyślny konstruktor uniemożliwia wywoływanie emplace_back
class A {
public:
int a;
A() = default;
A(int a) {
this->a = a;
}
A(A const & a) = delete;
A& operator =(A const & a) = delete;
A(A && a) = default;
A& operator =(A && a) = default;
};
int main() {
A a(4);
std::vector<A> vec;
vec.emplace_back(std::move(a)); // Error: type is not assignable
return 0;
}
Po usunięciu domyślnego konstruktora błąd zniknie! Ponadto, jeśli konstruktor domyślny jest zdefiniowany (nawet jeśli to nic nie robi), błąd idzie również z dala:
class A {
public:
int a;
A() {
}
A(int a) {
this->a = a;
}
A(A const & a) = delete;
A& operator =(A const & a) = delete;
A(A && a) = default;
A& operator =(A && a) = default;
};
int main() {
A b;
A a(4);
std::vector<A> vec;
vec.emplace_back(std::move(a)); // Error gone
return 0;
}
Wydaje się, że „() = default;” jest przyczyną problemu. Czy to normalne zachowanie na części kompilatora lub jest to błąd?
[clang] (http://coliru.stacked-crooked.com/a/1c9da1c732899237) wyświetla to samo zachowanie, co gcc – jaggedSpire
Kod kompiluje się dobrze z gcc 4.7.2 pod C++ 11 –
Wpływa na trywialność klasa. –