原文转自:https://blog.csdn.net/pleasecallmewhy/article/details/34941721 根据自己的理解稍作改动,希望不会会错其意。
C++ 11中引入的auto主要有两种用途:自动类型推断和返回值占位,auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作(主要是为了少些代码)。
当你想要遍历STL容器中元素的时候,想一想你会怎么写迭代器代码,老式的方法是用很多typedef来做,而auto则会大大简化这个过程。
std::map<std::string, std::vector<int>> map;
for(auto it = begin(map); it != end(map); ++it)
{
}
另外,在使用模板技术时,如果某个变量的类型依赖于模板参数,不使用auto将很难确定变量的类型(使用auto后,将由编译器自动进行确定)。下面是一个具体的例子。
template <class T, class U>
void Multiply(T t, U u)
{
auto v = t*u;
}
auto返回值占位,这种用法要与decltype配合使用,用于返回值类型后置时的占位。
template <typename T1, typename T2>
auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)
{
return t1+t2;
}
auto v = compose(2, 3.14); // v's type is double
你应该注意到,auto并不能作为函数的返回类型,他是配合decltype 来进行模板函数的编写的,但是你可以用auto 去接收 函数的返回值。接收的auto不会告诉编译器去推断返回值的实际类型,它会通知编译器在函数的末段去寻找返回值类型.
自动化推导decltype
关于 decltype 是一个操作符,其可以评估括号内表达式的类型,其规则如下:
-
如果表达式e是一个变量,那么就是这个变量的类型
typedef decltype (vi.begin()) CIT;
如果表达式e是一个函数,那么就是这个函数返回值的类型。上面的例子也适用于这个规则。
-
如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。
还有一个适合的用法是用来typedef函数指针,也会省很多事。decltype(&myfunc) pfunc = 0; typedef decltype(&A::func1) type;