У меня есть класс с удаленным конструктором перемещения, и когда я пытаюсь вызвать std :: vector :: push_back() в MSVC (v.15.8.7 Visual C++ 2017), я получаю сообщение о том, что я пытаюсь получить доступ к удаленный конструктор перемещения. Однако, если я определяю конструктор перемещения, код компилируется, но конструктор перемещения никогда не вызывается. Обе версии компилируются и запускаются, как и ожидалось, в gcc (v. 5.4).
Вот упрощенный пример:
#include <iostream>
#include <vector>
struct A
{
public:
A() { std::cout << "ctor-dflt" << std::endl; }
A(const A&) { std::cout << "ctor-copy" << std::endl; }
A& operator=(const A&) { std::cout << "asgn-copy" << std::endl; return *this; }
A(A&&) = delete;
A& operator=(A&& other) = delete;
~A() { std::cout << "dtor" << std::endl; }
};
int main()
{
std::vector<A> v{};
A a;
v.push_back(a);
}
который при компиляции в Visual Studio выдает следующую ошибку:
error C2280: 'A::A(A &&)': attempting to reference a deleted function
Однако, если я определяю конструктор перемещения вместо его удаления
A(A&&) { std::cout << "ctor-move" << std::endl; }
все компилируется и запускается со следующим выводом:
ctor-dflt
ctor-copy
dtor
dtor
как и ожидалось. Нет вызовов конструктору перемещения. (Живой код: https://rextester.com/XWWA51341)
Более того, обе версии прекрасно работают на gcc. (Живой код: https://rextester.com/FMQERO10656)
Итак, мой вопрос: почему вызов std :: vector :: push_back() для неподвижного объекта не компилируется в MSVC, хотя конструктор перемещения, очевидно, никогда не вызывается?