为什么需要复制构造函数来声明和初始化C++的对象

Why is copy constructor needed to declare and initialize an object in C++?

本文关键字:初始化 C++ 对象 声明 复制 构造函数 为什么      更新时间:2023-10-16

对于我的问题,我需要你考虑这个结构:

struct Foo
{
    Foo() { /* hooray, this is default ctor! */ }
private:
    Foo(const Foo&);
};

当我想像这样实例化它时:

Foo foo = Foo();

编译器抱怨Foo的复制构造函数无法访问(或在C++11中删除)。为什么它需要一个复制构造函数来初始化我的对象?

无论如何,我把这个复制构造函数公开了,期望它会被调用......但你猜怎么着?不是!

所以,这是我的问题:为什么编译器需要一个它实际上不用来实例化我的对象的复制构造函数?

注意:我在写auto foo = Foo();时注意到了这种行为

编辑

  • G++ 4.8:删除复制 ctor 将产生编译错误
  • MSVC (VC100、VC120):如果删除了复制 CTOR,则不抱怨
  • 在任何情况下:将副本 CTOR 设为私有将产生编译错误
这是一个

复制初始化

Foo foo = Foo();

从语义上讲,这意味着默认在 RHS 上构造Foo,并且 LHS 是从它复制构造的。因此,必须有一个可访问的复制构造函数。

实际上,可以省略副本,因此只进行一个默认构造。这就是不调用复制构造函数的原因。

请注意,在某些情况下,允许(但不强制)实现执行复制省略。强制复制构造函数可访问可确保代码在所有平台上编译,无论它们是否执行 elision。