gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:13:13 27 4
gpt4 key购买 nike

我只是在 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 和移动构造函数,并且它需要每个不可复制的类(这不是并且绝对不应该是与我的模板类一起使用的要求)具有明确定义的移动构造函数。

最佳答案

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

关于c++ - 为什么这段代码试图调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com