XiangXiChen's Blog

A Programmer's Blog

C++11 -- auto

2013-04-15 | Comments

学习中……

WHAT
auto关键字在C++11之前就已经存在, 但是在C++11标准中给auto赋予了新的定义,并且抛弃了老的定义。
C++11前的定义:auto可以用于定义局部变量。
C++11的定义:auto用于描述一个变量类型,该类型可以通过初始化表达式来进行推导,例如: auto x = 1, 编译器就可以通过x的初始值1来推导出x是一个int类型。

HOW
下面是关于auto的使用方法。
float& bar();

auto y1 = bar();//y1是float类型

const auto& y2 = bar();//y2是const float&类型

auto& y3 = bar();//y3是float&类型

int foo();

auto x1 = foo(); //x1 是int类型

const auto& x2 = foo(); //x2是const int&类型

auto& x3 = foo();//x3是int&类型,但是该语句是错误的,因为一个临时变量不能绑定到一个引用类型,foo()的返回值产生一个临时变量,然后在复制给x3.

auto add(int a, int b) -> int;//相当于函数int add(int a, int b)

auto ptr() -> int (*)[5];//相当于int (*ptr())[5];

template<typename T> void print(const vector<T>& v){
for(auto p = v.begin(); p!= v.end(); ++p){
cout << *p << "\n";
}

template<typename T> void test(const vector<T>& v, const vector<T>& u){
...
auto tmp = v[i]*u[i];
...
}

IDIOMS
NONE

PROBLEMS

  • 1. 使用auto声明的变量,很难指出该变量是不是引用类型。例如:
    //...
    auto b = d;//该赋值是引用的,还是通过切割一个对象赋值
    b.f();//b还有多态的特性吗?
  • 2. 某些情况的函数返回值类型不是很直观。例如(上面代码中也有):
    float& bar();

    auto y1 = bar();//y1是float类型还是float&类型


引用
1.http://www.stroustrup.com/C++11FAQ.html#auto
2. http://www.cnblogs.com/soaliap/archive/2013/01/08/2851538.html
3. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1478.pdf
4.http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/