首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:const int *和cont int &之间类型auto的不同推导

C++:const int *和cont int &之间类型auto的不同推导
EN

Stack Overflow用户
提问于 2015-10-01 03:08:02
回答 4查看 246关注 0票数 4

以下是代码示例。

代码语言:javascript
复制
a. int ii = 0;
b. const int ci = ii;
c. auto e = &ci; --> e is const int *
d. auto &f = 42; --> invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
e. const auto &g = 42 --> ok

观察:

对于子句c)类型const是自动推导的;对于子句d)类型const不是自动推导的;对于子句e)必须手动添加类型const才能使其工作。

为什么为子句c自动推导出const类型,而不是d?

EN

回答 4

Stack Overflow用户

发布于 2015-10-01 03:09:36

原因不是常量,而是r-值。

您不能接受对r值的非常数引用。

如果你想知道什么是r值,最初的想法是只能在赋值的右边。

为了获取一个编译时间常量的地址,编译器首先复制它,然后给你这个地址。要启用该行为,引用必须显式为const

要完成答案: case

  • c) ci的类型为const int,因此&ci的类型为const int.
  • d)的address,42的类型为intauto推断为intf声明为对int的引用,但未能绑定到r值
  • e) g的类型为const int &,可以绑定到编译时间常数。
票数 7
EN

Stack Overflow用户

发布于 2015-10-01 03:22:02

这是因为42的类型不是const int,而是int。它是一个右值,这意味着它不能绑定到左值引用(除非它是对const的引用),但它仍然是int类型。这就是auto的推论。

如果你用ci而不是42来尝试它,你会发现它是works

代码语言:javascript
复制
auto &e = ci;
票数 1
EN

Stack Overflow用户

发布于 2015-10-01 03:21:43

在……里面

代码语言:javascript
复制
auto &f = 42;

42的类型是int,所以auto &f变成了int &f。现在42是一个编译时文字,因此它是一个r值。我们不能将r值绑定到引用上,所以你会得到一个编译器错误。当你使用

代码语言:javascript
复制
const auto &g = 42

g现在是一个const int &const &可以绑定到一个临时的,并延长它的生命周期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32873834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档