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