为什么编译器提供默认的拷贝构造

mah*_*esh 11 c++ compiler-construction

我想知道为什么编译器提供默认的复制构造函数.这个想法背后的策略是什么.

提前致谢.

Mic*_*urr 27

从一个相关的(但不是相同的)问题 - 为什么C++编译器不能定义operator ==和operator!=?:

Stroustrup在"C++的设计和演变"(第11.4.1节 - 复制控制)中说明了默认的复制构造函数:

我个人认为不幸的是,复制操作是默认定义的,我禁止复制我的许多类的对象.但是,C++从C继承了它的默认赋值和复制构造函数,并且它们经常被使用.

所以答案是Stroustrup不情愿地将其与C语言向后兼容(可能是大多数C++瑕疵的原因,但也可能是C++流行的主要原因).

出于我自己的目的,在我的IDE中,我用于新类的片段包含私有赋值运算符和复制构造函数的声明,这样当我生成一个新类时,我没有得到默认赋值和复制操作 - 我必须显式删除声明如果我希望编译器能够为我生成它们,那么来自private:section的那些操作.

  • 像boost :: noncopyable这样的基类可以更简洁地实现同样的功能 (7认同)

Bil*_*ard 8

C++编程语言,第11.3.4节复制

...对于默认复制构造函数具有正确语义的类型,我更喜欢依赖于该默认值.它比我能写的任何东西都要简洁,人们应该理解默认值.此外,编译器了解默认值及其可能的优化机会.此外,手动写出成员副本对于具有许多数据成员的类来说是繁琐且容易出错的.

基本上,我读到这一点,因为默认的复制构造函数可以节省您的工作量,使您免于因繁琐而导致的错误,并通过消除手动优化它的诱惑(通过让编译器这样做)来帮助优化代码.

  • 我不认为这与D&E的说法有冲突.请注意,此处的语句由"默认复制构造函数具有正确的sematics"的位置限定.在D&E中所说的是他经常明确地禁用自动生成的复制文件,因为它通常没有正确的语义,并且他本来希望默认的复制文件不是自动生成的(但是他的手是绑的) .在CPL中,他说*如果*你只是要复制位,让编译器为你做. (4认同)
  • 这句话与他在"C++的设计和演变"中所说的完全相同,嗯. (2认同)
  • @Michael Burr:我认为"我个人认为**不幸**复制操作是默认定义的......"和"......我更喜欢**依赖于默认值"之间的措辞不同.(强调我的)是令人困惑的.我同意"......默认复制构造函数具有正确的语义......"的限定几乎使感知冲突无效. (2认同)

Ste*_*ini 6

因为否则,当您按值传递实例时,编译器如何生成一个实例?

  • 我想你可能让编译器抱怨缺少复制构造函数. (13认同)