double& d = 3 + 4;
因为它没有将临时对象3+4绑定到引用d上,而是使用对象3+4初始化了引用。根据标准规定,只有当值不是类型或引用(或继承)的情况下,引用才不会使用从临时对象转换或其他方式获得的对象来初始化(即另一个临时对象)。您可以在此示例中看到:
int i = 2;
double & d = i;
这是不合法的,因为i既不是double类型,也没有继承它。然而,这意味着临时对象可以绑定到引用上 - 但这真的是绑定吗?难道不是使用临时对象作为其参数使用复制构造函数创建新对象吗?
因此,我认为使用const A& param作为方法参数的重点并不在于第二种情况下这样的方法无法将A类型的临时对象作为参数(因为它可以),而是因为它涉及到复制构造函数(就像参数是A类型一样)。我对吗?
double& d = 3 + 4;
不合法,因为引用类型未被const限定。 - CB Baileydouble&& d = 3 + 4;
是合法的(在 C++0x 中),因为3+4
是一个右值(无论它是否有意义,合法与否是另一个问题)。 - Damon