声明:本文是在Alex Allain的文章的基础上写成的。
加入了很多个人的理解,不是翻译。
转载请注明出处 http://blog.csdn.net/srzhz/article/details/7934483
自动类型推断
当编译器能够在一个变量的声明时候就推断出它的类型,那么你就能够用auto关键字来作为他们的类型:
[cpp]
- auto x = 1;
比如下面这个例子:
在原来的C++中,你要想使用vector的迭代器得这么写:
[cpp]
- vector<int> vec;
- vector<int>::iterator itr = vec.iterator();
[cpp]
- vector<int> vec;
- auto itr = vec.iterator();
比如说有这样的代码:
[cpp]
- template <typename BuiltType, typename Builder>
- void
- makeAndProcessObject (const Builder& builder)
- {
- BuiltType val = builder.makeObject();
- // do stuff with val
- }
[cpp]
- template <typename Builder>
- void
- makeAndProcessObject (const Builder& builder)
- {
- auto val = builder.makeObject();
- // do stuff with val
- }
你以为自动类型推断只有这样的用法?那也太naive了。C++11还允许对函数的返回值进行类型推断
新的返回值语法和类型获取(Decltype)语句
在原来,我们声明一个函数都是这样的:
[cpp]
- int temp(int a, double b);
现在你可以将函数返回值类型移到到参数列表之后来定义:
[cpp]
- auto temp(int a, double b) -> int;
[cpp]
- class Person
- {
- public:
- enum PersonType { ADULT, CHILD, SENIOR };
- void setPersonType (PersonType person_type);
- PersonType getPersonType ();
- private:
- PersonType _person_type;
- };
[cpp]
- Person::PersonType Person::getPersonType ()
- {
- return _person_type;
- }
[cpp]
- auto Person::getPersonType () -> PersonType
- {
- return _person_type;
- }
当然上述应用只能说是一个奇技淫巧而已。并没有帮我们多大的忙(代码甚至都没有变短)。所以还得引入C++11的另一个功能。
类型获取(Decltype)
既然编译器能够推断一个变量的类型,那么我们在代码中就应该能显示地获得一个变量的类型信息。所以C++介绍了另一个功能:decltype。(实在是不知道这个词该怎么翻译,姑且称之为类型获取)。
[cpp]
- int x = 3;
- decltype(x) y = x; // same thing as auto y = x;
[cpp]
- template <typename Builder>
- auto
- makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )
- {
- auto val = builder.makeObject();
- // do stuff with val
- return val;
- }
这个功能非常重要,在很多时候,尤其是引入了泛型编程的时候,你可能记不住一个变量的类型或者类型太过复杂以至于写不出来。你就要灵活使用decltype来获取这个变量的类型。
自动类型推断在Lambda表达式(匿名函数)中的作用
请参考http://blog.csdn.net/srzhz/article/details/7934652