c++11中的auto疑问,谢谢。

poor_coder 2015-01-21 08:41:53
还可以将引用的类型设为auto,此时原来的初始化规则仍然适用:

const int ci = 10;
auto &g = ci; // g是一个整型常量引用,绑定到ci --- 此处g是自动推导成const int &吗?
auto &h = 42; // 错误:不能为非常量引用绑定字面值 --- 为什么h不能自动推导为const int &???
const auto &j = 42; // 正确:可以为常量引用绑定字面值
...全文
477 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamesjmnzhang 2018-07-19
  • 打赏
  • 举报
回复
我在使用auto 的时候,make然后启动代码,提示 unknown type (linux系统)
bear234 2015-01-22
  • 打赏
  • 举报
回复
右值引用 和 左值引用 的问题 和auto无关
sinat_25507829 2015-01-22
  • 打赏
  • 举报
回复
1. 注意常量并不等于右值; 2. 引用类型是且仅是左值的别名。

    // 42字面值是右值,见<c++ primer Page62>,
    auto & h = 42; // 错误,不能为非常量引用绑定字面值
    const auto & j = 42; // 正确,可以为常量引用绑定字面值
   
    // 再看<primer Page471>, 左值持久,右值短暂:
    int &&rr1 = 42; // 正确,字面量是右值(按c++11右值引用类型使用&&符号)
    int &&rr2 = rr1; // 错误,表达式rr1是左值
3与auto无关
Madokakaroto 2015-01-21
  • 打赏
  • 举报
回复
auto关键字推导,一般情况下跟函数的模板参数推导规则一样,主要有一下三种情况 先看一个模板函数template <typename T> void Foo(T& foo); Foo(value); 再回到楼主的auto& foo = value; 1. auto等同于T 2. foo的类型由T&(auto&)决定 3. value可以是一个右值,也可以是一个左值; 推导规则 a. 那么auto和T的类型推导,无论value是何种类型,都将忽略引用修饰符! b. const与volatile关键字不会被忽略 楼主的auto& h = 42; 编译器将auto推导为int,但是int&不能绑定到一个纯右值,所以无法通过编译 更多详细的资料请参考effective modern C++ 的Item2.
Saleayas 2015-01-21
  • 打赏
  • 举报
回复
auto &h = 42; 就算是 int &h = 42 也是不对的。
pengzhixi 2015-01-21
  • 打赏
  • 举报
回复
也没办法,像字符串字面量可以放在“常量数据区” 至于那些整形字面量印象中没有说放在哪?而const修饰的变量可以是栈上,堆上,也可以是常量数据区,而且这个const仅能帮助编译器检测是否对它修饰的变量做修改。并不关心所修饰的东西放在哪。
  • 打赏
  • 举报
回复
1 auto -> const int 2 auto -> int
FancyMouse 2015-01-21
  • 打赏
  • 举报
回复
那票literal的定义一开始就没说过const……auto下来只是按照规则推导出来没有const而已。接下来的事就和auto& x = T();报错同一个道理了。这锅得是literal背,而不是auto背。 至于为什么literal的定义不含const,这设计原因这我就不清楚了。
码匠许师傅 2015-01-21
  • 打赏
  • 举报
回复
和类型推导无关,因为“引用必须绑定到变量上”,而不能是常量: int &iref = 42; // 会有同样错误
pengzhixi 2015-01-21
  • 打赏
  • 举报
回复
auto &h = 42; 我可以推导为 const char ,const float,可以么
fly_dragon_fly 2015-01-21
  • 打赏
  • 举报
回复
C++标准是用来卖钱的,这种新特性说不定什么时候就改了,就直接记住 吧
paschen 版主 2015-01-21
  • 打赏
  • 举报
回复
引用 3 楼 xusiwei1236 的回复:
和类型推导无关,因为“引用必须绑定到变量上”,而不能是常量: int &iref = 42; // 会有同样错误
+1
mujiok2003 2015-01-21
  • 打赏
  • 举报
回复
想要保留const属性的话, 1.

auto const& x = 42;
2
引用
auto && x = 42;
mujiok2003 2015-01-21
  • 打赏
  • 举报
回复
这里有答案 auto &x = 42; 42是一个rvalue, 其类型是int。 auto &x的声明等价于 int& x, 自然不能绑定到右值。
lincolnandlinda 2015-01-21
  • 打赏
  • 举报
回复
你这样可以写 auto&& i=42; // valid in c++11
lincolnandlinda 2015-01-21
  • 打赏
  • 举报
回复
in c++ 14, decltype(auto)不忽略引用修饰符

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧