为什么这段代码试图调用复制构造函数
Why is this code trying to call the copy constructor?
我刚刚在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&&) { }
};
它编译得很好。为什么会这样?
如果不能从基类中修复这一问题,那将是非常不方便的,因为我有一个模板类,它像示例一样使用placement new和move构造函数,并且它将要求每个不可复制的类(这不是,也绝对不应该是与我的模板类一起使用的要求)都有一个显式定义的move构造函数。
如果您使用的是Visual Studio 2010或2012,请注意:编译器不会自动为您生成移动构造函数。这并没有得到实施。所以你需要自己写。
您一定面临编译器错误。标准规定B
得到一个隐式声明和定义的move构造函数;满足12.8(9)的所有条件(即B
不具有显式声明的复制构造函数、复制赋值等,并且移动构造函数不会隐式声明为deleted
)。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 为什么调用复制构造函数而不是移动构造函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 编译器调用复制运算符而不是移动运算符
- push_back std::vector,则重复调用复制构造函数
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- C++ - 从移动分配运算符调用复制分配
- 构造函数初始值设定项列表未调用复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 通过引用传递对象时是否调用复制构造函数?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 为什么要抛出引用调用复制构造函数的异常?
- 为什么即使参数标记为"const",也会调用复制构造函数?
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 为什么调用复制构造函数,当我只返回对象 c++ 的引用时
- 为什么在下面的代码中调用复制构造函数两次