C++ 为什么这段代码试图调用复制构造函数?
我只是在VisualStudio中花了过多的时间处理一个编译错误。我已经将代码提炼到下面的可编译小示例中,并在IdeOne上进行了尝试,得到了您可以看到的相同错误 我想知道为什么下面的代码试图调用C++ 为什么这段代码试图调用复制构造函数?,c++,c++11,copy-constructor,placement-new,move-constructor,C++,C++11,Copy Constructor,Placement New,Move Constructor,我只是在VisualStudio中花了过多的时间处理一个编译错误。我已经将代码提炼到下面的可编译小示例中,并在IdeOne上进行了尝试,得到了您可以看到的相同错误 我想知道为什么下面的代码试图调用B(const B&)而不是B(B&&): 它编译得很好。为什么会这样 如果不能从基类中修复,这将非常不方便,因为我有一个模板类,它使用placement new和move构造函数,如示例所示,并且它将需要每个不可复制的类(这不是也绝对不应该是我的模板类使用的要求)如果您使用的是Visual Studi
B(const B&)
而不是B(B&&)
:
它编译得很好。为什么会这样
如果不能从基类中修复,这将非常不方便,因为我有一个模板类,它使用placement new和move构造函数,如示例所示,并且它将需要每个不可复制的类(这不是也绝对不应该是我的模板类使用的要求)如果您使用的是Visual Studio 2010或2012,请注意:编译器不会自动为您生成移动构造函数。这没有得到实施。因此,您需要自己编写它们。您必须面对编译器错误。标准规定
B
获取隐式声明和定义的移动构造函数;满足12.8(9)中的所有条件(即B
没有显式声明的复制构造函数、复制赋值等,移动构造函数不会隐式声明已删除)。是否有编译器生成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上可以很好地工作。应该注意的是,移动构造函数何时应该隐式定义为默认值的细节在标准化过程接近尾声时发生了变化,而vc2010在这之前就已经存在了。另外,vc2010不支持=delete
,这使得很难谈论移动构造函数的一致性:),这是非常令人讨厌的。我渴望VS11。谢谢。@Seth Carnegie:VC11也不会自动生成移动构造函数。。。“Rvalue references v3.0添加了新规则,以在特定条件下自动生成移动构造函数和移动分配运算符。这不会在VC11中实现,它将继续遵循VC10从不自动生成移动构造函数/移动分配运算符的行为。”我猜这就是我使用VS得到的结果,在标准之间编写的编译器。谢谢
#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;
}
class B : public A {
public:
B() { }
B(B&&) { }
};