为什么复制ctor的参数通过引用传递?

时间:2014-09-14 13:22:04

标签: c++ constructor initialization copy-constructor

为什么不通过值传递参数?

当我尝试它时,我的编译器只给了我一条消息说"你可能意味着Foo(const Foo&)。"

这是什么原因?

2 个答案:

答案 0 :(得分:7)

因为传递值首先需要复制构造函数。

因此,为了避免无限递归,如果我们确实希望通过值1传递,则必须在传递值版本之前定义传递引用复制构造函数。由于通过值复制构造函数没有多大意义,标准禁止它。

答案 1 :(得分:5)

根本不允许您按值传递 - 标准的§12.8[class.copy] / p6明确禁止它:

  

如果类X的构造函数的声明形式不正确   第一个参数是类型(可选择cv-qualified)X和其中之一   没有其他参数或其他所有参数都有   默认参数。成员函数模板永远不会实例化   产生这样的构造函数签名。

正如评论中所解释的那样,这种禁止的原因是无限递归 - “制作副本,你必须制作副本”没有多大意义。