人们经常会读到您不能将普通的左值引用绑定到临时对象。因此,当他们不想涉及复制时,经常会看到 A 类的方法以 const A& 作为参数。然而,这样的构造是完全合法的:
double& d = 3 + 4;
因为它没有将临时对象 3 + 4 绑定到引用 d,而是使用对象 3 + 4 初始化引用。正如标准所说,只有当值不是类型或引用(或继承)时,引用才会使用从临时对象获得的对象进行初始化,使用转换或某事(即另一个临时对象)。在这种情况下,您可以看到:
int i = 2;
double & d = i;
这是不合法的,因为 i 不是 double 类型,也不是从它继承的。然而这意味着,临时对象可以绑定到引用 - 但它真的有约束力吗?不是用临时对象作为参数的复制构造函数创建一个新对象吗?
因此,正如我认为的那样,让方法采用 const A& param 而不是 A& 并不是在第二种情况下,这种方法不能作为参数 A 类型的临时对象(因为它会),而是因为它涉及复制构造函数(就像参数是 A 类型一样)。我对吗?