为什么在函数 returns 时调用复制构造函数(C++ class)?

Why does the copy constructor (of a C++ class) get called when a function returns?

这是一个程序片段:

cls fun(cls a)
{
     cls v;
     v = a.scale(2.0);
     return v;
}
int main()
{
     cls a(0.0,1.0,2.0);
     cls a2;
     a2 = fun(a);
     return 0;
}

在上面的代码中,假设 class 定义的 class "cls" 已经定义了构造函数和 "scale" 函数。我的疑问是在 main 函数中我们实例化了对象 a2,然后将其分配给函数的 return 值。那么,为什么在这种情况下会调用复制构造函数呢? (我正在关注一些资源以了解使用 C++ 的 OOP,那里提到在上述情况下调用了复制构造函数。)

此外,在上面的代码中,如果我写:

cls a2 = fun(a);

然后,根据我的理解,必须调用复制构造函数(因为我们将 a2 实例化为某物的副本)。现在,fun(a) returns是一个临时对象,但是拷贝构造函数的参数是取一个引用值,因为我们不能取一个临时对象的引用值,这不应该报错吗?

编译器生成的复制构造函数将 const 引用作为参数。

允许匿名临时绑定到 const 引用,因此编译通过。

请注意,由 return v; 创建的隐含值副本在以后的 C++ 标准中被 删除