作者:000冷000 | 来源:互联网 | 2022-12-01 16:31
我有一个删除了移动构造函数的类,当我尝试在MSVC中调用std :: vector :: push_back()时(v.15.8.7 Visual C++ 2017)我收到错误消息说我正在尝试访问已删除的移动构造函数.但是,如果我定义了移动构造函数,则代码会编译,但永远不会调用移动构造函数.这两个版本在gcc(v.5.4)上按预期编译和运行.
这是一个简化的例子:
#include
#include
struct A
{
public:
A() { std::cout <<"ctor-dflt" < 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" <
一切都编译并运行,输出如下:
ctor-dflt
ctor-copy
dtor
dtor
正如所料.没有调用移动构造函数.(实时代码:https://rextester.com/XWWA51341)
而且,这两个版本在gcc上运行得非常好.(实时代码:https://rextester.com/FMQERO10656)
所以我的问题是,为什么在MSVC中不能在非可移动对象上调用std :: vector :: push_back(),即使移动构造函数显然从未调用过?