Auto | 1. 带有const的推导特殊情况 |
2.不能使用auto的情景 | |
3.最适合使用auto的情景 |
1. 带有const的推导特殊情况 |
auto 的常规推导很简单 除了带有const的特殊情况
带有const的推导规则
当变量不是指针或者引用类型时,推导的结果中不会保留const、volatile关键字
当变量是指针或者引用类型时,推导的结果中会保留const、volatile关键字
引用&符号不会被auto继承继承
2.不能使用auto的情景 |
1.不能用于类内非静态成员变量的初始化
class T
{
auto a = 10; //Error
};
class T
{
vector<int> v(10);
v.push_back(1);
for(auto it = v.begin(),it!=v.end(),it++) //正确 类内这种是被允许的
{
....
}
};
2.不能用auto来定义数组
int func()
{
int array[] = {1,2,3,4,5}; // 定义数组
auto t1 = array; // ok, t1被推导为 int* 类型
auto t2[] = array; // error, auto无法定义数组
auto t3[] = {1,2,3,4,5};; // error, auto无法定义数组
}
3.最适合用auto的情况 |
1.复杂的迭代器
2.函数模板 或 类模板 因函数重载 不确定返回值类型 可以利用 auto 接受
#include <iostream>
#include <string>
using namespace std;
class T1
{
public:
static int get()
{
return 10;
}
};
class T2
{
public:
static string get()
{
return "hello, world";
}
};
template <class A>
void func(void)
{
auto val = A::get();
cout << "val: " << val << endl;
}
int main()
{
func<T1>();
func<T2>();
return 0;
}