在 C++11 中可以使用 auto 自动推导变量的类型,还能够结合 decltype 来表示函数的返回值
PS:
使用auto声明的变量必须要进行初始化,以让编译器推导出它的实际类型,在编译时将auto占位符替换为真正的类型
auto定义变量
auto 变量名 = 变量值;
实例
int main() {
// int
auto i = 5;
// double
auto d = 6.6;
//float
auto f = 3.4f;
int ii = 110;
auto *a = ⅈ // auto: int
auto b = ⅈ // auto: int *
auto &c = ii; // auto: int
auto dd = ii; // auto int
int tm = 88;
const auto first = tm; // const int
auto second = first; // int 非指针或引用类型推导的结果中不会保留 const、volatile 关键字
const auto &third = tm; // const int&
auto& fourth = third; // const int&
auto* fifth = &first; // const int*
return 0;
}
auto不能使用的场景
- 不能作为函数参数使用。因为只有在函数调用的时候才会给函数参数传递实参,auto 要求必须要给修饰的变量赋值,因此二者矛盾
- 不能用于类的非静态成员变量的初始化
- 不能使用 auto 关键字定义数组
- 无法使用 auto 推导出模板参数
decltype使用
推导规则
- 表达式为普通变量或者普通表达式或者类表达式,在这种情况下,使用 decltype 推导出的类型和表达式的类型是一致的
- 表达式是函数调用,使用 decltype 推导出的类型和函数返回值一致,
- 表达式是一个左值,或者被括号 ( ) 包围,使用 decltype 推导出的是表达式类型的引用(如果有 const、volatile 限定符不能忽略)
int fun() {}
int * funp() {}
const int func_cint() {}
class Test
{
public:
int num;
Test() {}
};
int main() {
int a = 10;
decltype(a) b = 99; // b -> int
decltype(a+3.14) c = 52.13; // c -> double
decltype(a+b*c) d = 520.1314; // d -> double
decltype(fun()) e = 55; // 如果是函数,则推导结果为函数返回值的类型
decltype(funp()) f = &a;
// 对于纯右值而言,只有类类型可以携带const、volatile限定符,除此之外需要忽略掉这两个限定符, 结果为int
decltype(func_cint()) g = 8;
const Test test;
//带有括号的表达式
decltype(test.num) first = 0; // int
decltype((test.num)) second = a; // const int&
//加法表达式
int n = 0, m = 0;
decltype(n + m) cc = 0; // cc是int类型
decltype(n = n + m) dd = n; // n是左值 dd是int &类型
return 0;
}
返回值类型后置
template<typename A, typename B>
auto add(A a, B b) -> decltype(a+b) {
return a+b;
}
int main() {
int a = 200;
double b = 3.14;
auto ret = add<int, double>(a, b);
auto ret1 = add(a, b);
cout << "ret = "<<ret <<" ret1 = "<<ret1<<endl;
return 0;
}
网友评论