一、auto
我们在声明一个变量时,需要预先知道我们要声明的变量是什么类型,但有的变量类型是比较长
比较难以书写,或有的时候比较困难推演出表达式的类型,特别是在泛型模板编程中的时候
所以 C++11 就引入了 auto 类型说明符,让编译器去分析表达式所属的类型,因为编译器需要推算
表达式的类型,所以在使用 auto 的时候,必须要给它一个初始值!不然编译器不知道如何去推算
例如
int i = 0; // i 为 int
auto a = 10; // a 为 int
auto b = i; // b 为 int
auto c; // 错误,没有初始值
二、decltype
基于 auto ,有时候我们想知道从表达式中推算出要定义的变量类型,但是又不想用该表达式的值
作为初始化。这怎么办呢
为满足这要求,C++11 引入了第二个类型说明符 decltype !
decltype 的作用是选择并返回操作数的数据类型。
例如:
#include <iostream>
using namespace std;
// 测试函数
double Fun(int &a, int &b)
{
return 0;
}
// 主函数
int main()
{
int x = 0;
int y = 0;
decltype(0) a = 0; // a 是 int
decltype(x) b = 0; // b 是 int
decltype(Fun(x, y)) c; // c 是 double且非必要初始化
return 0;
}
三、auto 和 decltype 不同点
auto 和 decltype 功能类似,但有也一些不同的地方
#include <iostream>
using namespace std;
// 主函数
int main()
{
const int const_value = 10; // const int
const int &const_value1 = const_value; // const int&
int value = 10; // int
int &value2 = value; // int&
int *value3 = &value; // int*
// 测试1
auto A1 = const_value; // A1 为 int,auto 忽略了顶级const
decltype(const_value) B1 = 0; // B1 为 const int
// 测试2
auto A2 = const_value1; // A2 为 int,auto 忽略了顶级const和引用
decltype(const_value1) B2 = A1; // B2 为 const int&
// 测试3
auto A3 = value; // A3 为 int
decltype(value) B3; // B3 为 int
// 测试4
auto A4 = value2; // A4 为 int,auto 忽略了引用
decltype(value2) B4 = value; // B4 为 int&
// 测试5
auto A5 = *value3; // A5 为解引用后 int 类型
decltype(*value3) B5 = value; // A5 为 int&
return 0;
}
以上可看出 auto 和 decltype 的区别在于 const 和非 const 与引用和非引用的区别
1.auto 会忽略顶级 const
2.auto 会忽略引用
3.auto 在表达式为解引用时,会返回解引用类型
4.decltype 在表达式为解引用时,会返回引用类型
另外:declptye 还有个特别注意的地方
***注意1
declptye((exp)) : 恒定返回引用类型!
declptye(exp) : 只有 exp 是引用类型,才返回引用类型
***注意2
看以下代码
#include <iostream>
using namespace std;
int Fun(int& a, int& b)
{
a = 0;
b = 0;
return 0;
}
// 主函数
int main()
{
int a = 5; int b = 3;
decltype(Fun(a, b)) B;
cout << "decltype 推算后 a 和 b 的值:\t a=" << a << ", b=" << b << endl;
auto A = Fun(a, b);
cout << "auto 推算后 a 和 b 的值:\t a=" << a << ", b=" << b << endl;
return 0;
}
*调试结果:可以看到,decltype 是不会去执行 Fun 函数的,它就只会做类型的推算
四、_End
完事儿