Похоже, что добавление конструктора по умолчанию предотвращает вызов emplace_back
и выдает сообщение об ошибке: "static assertion failed: type не присваивается" (gcc 5.3 с -std = С++ 14). Вот простой код, который иллюстрирует проблему:
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;
}
При удалении конструктора по умолчанию ошибка исчезает! Кроме того, если конструктор по умолчанию определен (даже если он ничего не делает), ошибка также исчезает:
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;
}
Кажется, что "A() = default;" что вызывает проблему. Это нормальное поведение на части компилятора или это ошибка?