繁体   English   中英

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

[英]how the binding of const type works in 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 )时,您会得到一个纯右值,因为转换后的int是临时的,在 memory 中没有地址。 因此,绑定对它的常规引用是行不通的,因为它们只能绑定到 glvalues。 const类型引用可以绑定到纯右值,所以第一个仍然可以编译。 资料来源: https://en.cppreference.com/w/cpp/language/value_category

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

因此,为了使引用的初始化完全起作用,必须创建一个正确类型int的新临时 object。 这是可能的,因为存在从doubleint的隐式转换序列。

然后引用应该绑定到这个临时的,即右值表达式,但只有const左值引用才允许绑定到右值。 不允许非const左值引用这样做,从而使第二个程序格式错误。

请注意,在第一个程序中,虽然引用绑定到一个临时 object,该临时 object 通常会在创建它的完整表达式结束时被销毁,但绑定到引用会将该临时 object 的生命周期延长到参考资料。 所以在第一个程序中使用r其实是可以的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM