【发布时间】:2012-02-17 23:56:05
【问题描述】:
我只是在 Visual Studio 中花费了大量时间来处理编译错误。我已将代码提炼成下面的可编译的小示例,并在 IdeOne 上进行了尝试,得到了相同的错误,您可以看到 here。
我想知道为什么下面的代码会尝试调用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 和移动构造函数,并且它需要每个不可复制的类(这不是并且绝对不应该是与我的模板类一起使用的要求)具有明确定义的移动构造函数。
【问题讨论】:
-
是否有编译器生成B(B&&)?我的 C++11 还是有点生疏。你的 B(B&&) 需要初始化 A(A&&) 吗?
-
@CashCow 是的,它所做的只是移动每个成员(如果那是错误的,那么我正在看着你,Kerrek SB
:)) -
在 GCC 4.6、GCC 4.7 和 Clang 3.0 上编译良好。
-
@CashCow:应该有,但是VS2010没有。
-
在 GCC 4.6.2 上运行良好。
标签: c++ c++11 copy-constructor placement-new move-constructor