为什么这段代码试图调用复制构造函数?

我只是在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&&) { } }; 

它编译好。 为什么是这样?

如果这不能从基类固定,这将是非常不方便的,因为我有一个模板类使用安置新和移动构造函数像例子,它会要求每个类是不可复制的(这是不是也绝对应该不是与我的模板类使用的要求)有一个明确定义的移动构造函数。

如果您使用Visual Studio 2010或2012,请注意:编译器不会自动为您生成移动构造函数。 这没有执行。 所以你需要自己写。

你必须面对一个编译器错误。 该标准说B得到一个隐式声明和定义的移动构造函数; 满足12.8(9)的所有条件(即B没有明确声明的拷贝构造函数,拷贝分配等,并且移动构造函数不会被隐式声明为deleted )。