在 C++03 中auto_ptr为什么不调用编译器生成的 copy-ctor?



我了解auto_ptr在 C++03 中的工作原理。它基于这个技巧。该技巧使用用户定义的转换在编写此类代码时从一个对象窃取指向另一个对象的指针auto_int p(auto_int(new int()));。但是,我在这方面有几个问题。

  1. 为什么不调用编译器生成的复制 ctor?
  2. 为什么用户定义的转换优先于编译器生成的复制转换?
  3. 是否有编译器生成的复制器开始?
  4. 如果不是,是什么语言规则抑制它?

为什么不调用编译器生成的复制 ctor?

因为该类已经提供了一个复制构造函数,一个仍然有效的可变构造函数,所以编译器不会生成默认的。

为什么用户定义的转换优先于编译器生成的复制转换?

没有编译器生成的复制构造函数。

是否有编译器生成的复制器开始?

最后!不,没有。

如果不是,是什么语言规则抑制它?

它是 12.8.2:

类 X 的非模板构造函数是复制构造函数,如果它的第一个参数是 X&、const X&、volatile X& 或 const volatile X&,并且没有其他参数,或者所有其他参数都有默认参数。

和 12.8.4:

如果类定义未显式声明复制构造函数,则隐式声明一个。

最新更新