为什么此绑定可以
int main()
{
double d = 4.56;
const int &r = d;
return 0;
}
但这不是
int main()
{
double d = 4.56;
int &r = d;
return 0;
}
当第一个编译但第二个显示错误时,有人能解释一下吗
绑定到转换后的类型(double
必须转换为int
(时,会得到一个prvalue,因为转换后的int
是临时的,内存中没有地址。因此,将常规引用绑定到它是不起作用的,因为它们只能绑定到glvalues。const
类型引用可以绑定到prvalue,所以第一个类型引用仍然编译。来源:https://en.cppreference.com/w/cpp/language/value_category
int
引用不能绑定到double
类型的对象,因为类型不匹配。
因此,为了使引用的初始化工作正常,必须创建一个正确类型为int
的新临时对象。这是可能的,因为存在从double
到int
的隐式转换序列。
然后,引用应该绑定到这个临时的,即绑定到右值表达式,但只允许const
左值引用绑定到右价。非const
左值引用不允许这样做,这使得第二个程序格式不正确。
请注意,在第一个程序中,尽管引用绑定到一个临时对象,该对象通常会在创建它的完整表达式结束时被销毁,但绑定到引用会将该临时对象的生存期延长到引用的生存期。所以在第一个程序中使用r
实际上是可以的
然而,通过r
的访问将不指向d
,而是指向独立于d
的新临时对象,这可能会令人惊讶,因此我认为这样写不是一个好主意。使用auto&
或const auto&
来确保r
肯定会引用d
,并且不会因为类型不匹配而发生任何隐式转换。如果您想要转换,只需使用int
,而不是引用int
。