const类型的绑定在c++中是如何工作的



为什么此绑定可以

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的新临时对象。这是可能的,因为存在从doubleint的隐式转换序列。

然后,引用应该绑定到这个临时的,即绑定到右值表达式,但只允许const左值引用绑定到右价。非const左值引用不允许这样做,这使得第二个程序格式不正确。

请注意,在第一个程序中,尽管引用绑定到一个临时对象,该对象通常会在创建它的完整表达式结束时被销毁,但绑定到引用会将该临时对象的生存期延长到引用的生存期。所以在第一个程序中使用r实际上是可以的

然而,通过r的访问将不指向d,而是指向独立于d的新临时对象,这可能会令人惊讶,因此我认为这样写不是一个好主意。使用auto&const auto&来确保r肯定会引用d,并且不会因为类型不匹配而发生任何隐式转换。如果您想要转换,只需使用int,而不是引用int

最新更新