复制构造函数未在c ++类上删除

J.D*_*Doe -3 c++

我试图创建一个永远不会重复的类,因为它的字段中有很多数据.为此,我定义了这样的类:

class Foo {
public:
   Foo(int i);
   Foo();
   Foo(const Foo&) = delete;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试执行以下操作,这会导致编译器错误:

Foo a(2);
Foo b = a;
Run Code Online (Sandbox Code Playgroud)

但无论出于何种原因,这都不包括复制数据的情况.

Foo* array;
array = new Foo[10000];
Foo a(2);
array[1] = a;
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

R S*_*ahu 7

首先,

Foo a();
Run Code Online (Sandbox Code Playgroud)

不会创建类型的对象Foo.它声明了一个不带参数的函数并返回一个Foo.

假设你有一个类型的对象Foo,

Foo b = a;
Run Code Online (Sandbox Code Playgroud)

调用复制构造函数进行初始化b.但是,当你使用

array[1] = a;
Run Code Online (Sandbox Code Playgroud)

它不使用复制构造函数.这是一项任务操作.delete复制构造函数不是delete复制赋值运算符.因此,最后一行不是错误.