为什么复制构造函数需要在C ++中声明和初始化一个对象?

时间:2013-12-17 17:05:28

标签: c++ c++11 constructor

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

struct Foo
{
    Foo() { /* hooray, this is default ctor! */ }

private:
    Foo(const Foo&);
};

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

Foo foo = Foo();

编译器抱怨Foo的复制构造函数不可访问(或者为C ++ 11删除)。为什么需要复制构造函数来初始化我的对象?

无论如何,我将这个复制构造函数公开期待它会被调用......但是猜猜是什么?它不是!

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

N.B。:当我写auto foo = Foo();

时,我注意到了这种行为

修改

  • g ++ 4.8:删除副本ctor会产生编译错误
  • msvc(vc100,vc120):如果删除副本,则不会抱怨
  • 在任何情况下:将复制ctor设为私有都会产生编译错误

1 个答案:

答案 0 :(得分:5)

这是复制初始化

Foo foo = Foo();

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

在实践中,the copy can be elided,因此只发生一个默认构造。这就是不调用复制构造函数的原因。

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