打印
[牛人杂谈]

C++11这些令人无比愉悦的改变(7) -- auto

[复制链接]
929|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
598330983|  楼主 | 2015-2-27 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
auto不是一个新事物,在遥远的C年前就早已有之,它用来建议将一个变量放到寄存器里,这样可以加快运算速度。
然而,编译器早已聪明如斯,断然知道哪些变量放到寄存器比较好,
也断然不需要程序员指定变量为auto,
事实上,自从C语言有了auto,就没多少人用过!!

C++11给auto赋予新的内涵,用它来自动指定类型。
例如,您可以写
auto i = 1;
auto j = i * 2;
没有问题,i, j是什么类型,编译器会自动帮忙判断出来。

如果尝试写c++模板代码,立刻就会发现auto赋予程序员的无比快乐。
想下在C++ 98的年代的代码
  • struct A
  • {
  •     typedef int Type;
  •     int a;
  •     int b;
  • };
  • struct B
  • {
  •    typedef double Type;
  •    double a;
  •    double b;
  • };
  • template<T>
  • void some_func(T &t)
  • {
  •     typedef typename T::type Type;
  •     Type c = t.a + t.b;
  •     ....
  • }


复制代码


上面的代码里,我们这样做类型推导,为了得到不同的类A和B中的数据类型,
我们不得不用一些typedef, 一步步构想类型的来龙去脉,

最好,我们终于通过typedef得到了t.a和t.b的类型。
这是个简单的例子,当模板复杂时,事情通常变得烦复无比。
这分明不是在编程,分明是在当人肉编译器嘛。。
编程本应该是充满愉悦的事情,不应该被这些语言的纠纷所困扰。

在C++11里面,一个auto, 事情变得明朗起来。
  • struct A
  • {
  •     int a;
  •     int b;
  • };
  • struct B
  • {
  •    double a;
  •    double b;
  • };
  • template<T>
  • void some_func(T &t)
  • {
  •     auto c = t.a + t.b;
  •     ....
  • }


复制代码

(转载请注明来自:nuvoton-m0.com)

沙发
598330983|  楼主 | 2015-2-28 07:05 | 只看该作者
以前没用过,所以弄过来大家看看

使用特权

评论回复
板凳
mintspring| | 2015-2-28 07:16 | 只看该作者
我看看,默认就是自动吧?

使用特权

评论回复
地板
myqq12| | 2015-3-2 09:06 | 只看该作者
我也在看,最近好像快出C++14了,现在还不知道哪些嵌入式编译环境支持C++11,

使用特权

评论回复
评论
john_lee 2015-3-12 09:00 回复TA
gcc 从 4.8.1 之后完全支持 C++11,最新的 5.0 (开发中)完全支持 C++14。 
5
huangqi412| | 2015-3-2 11:35 | 只看该作者
哪些编译器支持这个?

使用特权

评论回复
评论
john_lee 2015-3-12 09:01 回复TA
gcc 从 4.8.1 之后完全支持 C++11,最新的 5.0 (开发中)完全支持 C++14。 
6
gaoyang9992006| | 2015-3-4 18:12 | 只看该作者
我实在没看明白愉悦在哪儿

使用特权

评论回复
7
gaoyang9992006| | 2015-3-4 18:12 | 只看该作者
myqq12 发表于 2015-3-2 09:06
我也在看,最近好像快出C++14了,现在还不知道哪些嵌入式编译环境支持C++11, ...

消息好灵通啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

5332

帖子

22

粉丝