c++ - 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;
}
任何人都可以在第一个编译但第二个显示错误时向我解释
解决方案
int
引用不能绑定到类型的对象,double
因为类型不匹配。
因此,为了使引用的初始化完全起作用,int
必须创建一个正确类型的新临时对象。这是可能的,因为存在从double
到的隐式转换序列int
。
然后引用应该绑定到这个临时的,即右值表达式,但只有const
左值引用被允许绑定到右值。const
不允许非左值引用这样做,从而使第二个程序格式错误。
请注意,在第一个程序中,虽然引用绑定到一个临时对象,该对象通常会在创建它的完整表达式结束时被销毁,但绑定到引用会将该临时对象的生命周期延长到参考资料。所以r
在第一个程序中使用实际上是可以的。
但是,通过访问r
不会指代d
,而是指独立于 的那个新的临时对象d
,这可能会令人惊讶,因此我认为这样写并不是一个好主意。使用auto&
orconst auto&
确保r
肯定会引用d
并且由于类型不匹配而不会发生任何隐式转换。如果您想要转换,只需使用int
而不是对int
.
推荐阅读
- swift - queryOrdered 并不总是以正确的顺序返回 tableViewCell 上的数据
- python-3.x - Pygit2:在如何处理所有 repo 分支中的所有提交方面需要帮助
- css - 与 Internet Explorer 兼容的 CSS 过滤器生成器
- java - 通过读取其索引进行整数操作
- maven - 如何在没有第三方服务的情况下集成 Maven 和 Github?
- r - 按顺序生成排列 - R
- powershell - 提取两个方括号之间的值
- javascript - 我在哪里可以投票支持对 javascript 的更改?
- android - 在构造函数中初始化 Array 类属性
- spring-boot - 如何在 thymeleaf 中显示不在 src 的静态文件夹中的图像