我只是在 Visual Studio 中花费了大量时间来处理编译错误。我已将代码提炼成下面的可编译的小示例,并在 IdeOne 上进行了尝试,并得到了您可以在此处看到的相同错误。
我想知道为什么以下代码尝试调用B(const B&)
而不是B(B&&)
:
#include <iostream>
using namespace std;
class A {
public:
A() : data(53) { }
A(A&& dying) : data(dying.data) { dying.data = 0; }
int data;
private:
// not implemented, this is a noncopyable class
A(const A&);
A& operator=(const A&);
};
class B : public A { };
int main() {
B binst;
char* buf = new char[sizeof(B)];
B* bptr = new (buf) B(std::move(binst));
cout << bptr->data << endl;
delete[] buf;
}
我没有明确定义任何构造函数,所以B(std::move(binst))
应该调用编译器生成B(B&&)
,不是吗?
当我更改B
为
class B : public A {
public:
B() { }
B(B&&) { }
};
它编译得很好。为什么是这样?
如果这不能从基类中修复,那将非常不方便,因为我有一个模板类,它使用像示例这样的放置 new 和移动构造函数,并且它将需要每个不可复制的类(这不是而且绝对应该不是与我的模板类一起使用的要求)具有明确定义的移动构造函数。