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

时间:2020-04-12 13:01:32

标签: c++ reference constants

为什么这种绑定还可以

int main()
{
    double d = 4.56;
    const int &r = d;

    return 0;
}

但这不是

int main()
{
    double d = 4.56;
    int &r = d;

    return 0;
}

第一个编译时有人可以解释我吗?

2 个答案:

答案 0 :(得分:1)

当您绑定到转换后的类型(必须将double转换为int时,会得到一个prvalue,因为转换后的int是一个临时地址,其中没有地址记忆。因此,将常规引用绑定到它不起作用,因为它们只能绑定到glvalues。 const类型引用可以绑定到prvalue,因此第一个仍然可以编译。来源:https://en.cppreference.com/w/cpp/language/value_category

答案 1 :(得分:1)

int引用不能绑定到类型为double的对象,因为类型不匹配。

因此,为了使参考的初始化工作全部完成,必须创建正确类型int的新临时对象。之所以可以这样做是因为存在从doubleint的隐式转换序列。

然后,引用应绑定到该临时实例,即绑定到右值表达式,但仅允许const左值引用绑定到右值。不允许使用非const左值引用来执行此操作,从而使第二个程序格式错误。

请注意,在第一个程序中,尽管将引用绑定到一个临时对象,该对象通常会在创建该对象的全表达式结束时销毁,但绑定到引用可以将该临时对象的寿命延长至参考的有效期。因此,实际上在第一个程序中使用r即可。

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