auto:
1.定义:
在C++中, auto 是一个类型说明符,它让编译器在编译阶段自动推导变量的类型,其类型取决于初始化表达式的类型。auto 在声明变量时使用,编译器会根据变量初始化表达式自动推断类型。
#include<iostream>
#include <typeinfo>
using namespace std;
int fun()
{return 1;
}
int main()
{int a = 1;auto b = a;auto c = 'a';auto d = fun();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化return 0;
}
//typeid 是一种在运行时获取类型信息的方式,它可以用来实现类型安全的转换和其他依赖于类型识别的功能。
//是C++中的一个内置函数,返回一个const char*类型的指针,指向该类型信息的字符串表示。
//注意要包含#include <typeinfo>
2.注意事项:
1)必须初始化
2)不能和指针结合来修改数组:
auto* a 加一个 * 是在强调变量 a 是指针,故a只能接受指针类型,并不是将变量类型改为指针类型,没有指针auto类型。
3)在同句话中,auto的类型必须相同
4)auto& b 是在强调b是引用,但引用可以除了可以接收引用,还可以接收其它类型,故b除了可以接收引用外还可以接收其它类型(int, double……),说明b是该类型变量的引用。
decltype:
1.定义:
decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用。
2.形式
int x = 0;
decltype(x) y = 1; // y -> int
decltype(x + y) z = 0; // z -> int
const int& i = x;
decltype(i) j = y; // j -> const int &
const decltype(z) * p = &z; // *p -> const int, p -> const int *
decltype(z) * pi = &z; // *pi -> int , pi -> int *
decltype(pi)* pp = π // *pp -> int * , pp -> int * *
3.与auto区别:
1)auto根据=右边的初始值推导出变量的类型,decltype根据exp表达式推导出变量的类型,跟=右边的value没有关系
2)auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导而decltype不要求
auto p=value;
decltype(exp) p=value;
decltype也可以写为:
decltype(exp) p;
原则上将,exp只是一个普通的表达式,它可以是任意复杂的形式,但必须保证exp的结果是有类型的,不能是void;如exp为一个返回值为void的函数时,exp的结果也是void类型,此时会导致编译错误
4.应用:
类的静态成员可以使用auto, 对于类的非静态成员无法使用auto,如果想推导类的非静态成员的类型,只能使用decltype。
template<typename T>
class A
{
private :decltype(T.begin()) m;//typename T::iterator m; //这种用法会出错
public:
void func(T& hhh)
{m=hhh.begin();
}
};int main()
{const vector<int> vec;
A<const vector<int>> obj;
obj.func(vec);
return 0;
}