我有一个带有已删除移动构造函数的类,当我尝试在 MSVC(v.15.8.7 Visual C++ 2017)中调用 std::vector::push_back() 时,我收到一条错误消息,提示我正在尝试访问已删除的移动构造函数。但是,如果我定义了移动构造函数,则代码会编译,但永远不会调用移动构造函数。两个版本都可以在 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 中编译,即使显然从未调用过移动构造函数?