[英]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。 这是可能的,因为存在从double
到int
的隐式转换序列。
然后引用应该绑定到这个临时的,即右值表达式,但只有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.