为什么不通过值传递参数?
当我尝试它时,我的编译器只给了我一条消息说"你可能意味着Foo(const Foo&)
。"
这是什么原因?
答案 0 :(得分:7)
因为传递值首先需要复制构造函数。
因此,为了避免无限递归,如果我们确实希望通过值1传递,则必须在传递值版本之前定义传递引用复制构造函数。由于通过值复制构造函数没有多大意义,标准禁止它。
答案 1 :(得分:5)
根本不允许您按值传递 - 标准的§12.8[class.copy] / p6明确禁止它:
如果类
X
的构造函数的声明形式不正确 第一个参数是类型(可选择cv-qualified)X
和其中之一 没有其他参数或其他所有参数都有 默认参数。成员函数模板永远不会实例化 产生这样的构造函数签名。
正如评论中所解释的那样,这种禁止的原因是无限递归 - “制作副本,你必须制作副本”没有多大意义。