关于auto和decltype

 1 auto会忽略顶层const,保留底层const

 2 

 3     int i = 0;

 4 

 5     const int* const p = &i;

 6 

 7     auto p2 = p;    //p2是const int*,不是const int* const

 8     //*p2 = 4;      //错误,p指向常量

 9     p2 = nullptr;   //正确,p2本身不是常量

10 

11 

12 auto不会保留引用类型,应该使用auto&

13 

14     int& x = i;

15 

16     auto m = x;     //m是int,不是int&

17     auto& n = x;    //n是int&

18 

19 

20 decltype(variable)回保留顶层const和底层const

21 

22     decltype(p) p3 = p; //p3是const int* const

23     //*p3 = 4;  //错误

24     //p3 = nullptr; //错误

25 

26 

27 decltype也会保留引用类型,decltype((variable)) 双括号的结果永远是引用

28 

29     int* p = &i;

30 

31     decltype(*p) r = i; //解引用指针得到引用类型

32     decltype((i)) r = i;    //引用

33     decltype(r+0) b;     // 通过r+0可以得到int

34     decltype(*p+0) c;     //意思同上

35 

36 

37 用auto和decltype定义复杂的函数返回类型

38 

39     int array[10];  //array数组,下面定义一个函数,返回这个数组的指针

40     int (* func())[10];     //以前的定义方法

41     auto func2()->int(*)[10];   //C++11 尾置返回类型(星号必须加括号)

42     decltype(array)* func3();   //用decltype

43 

44 

45 定义函数指针

46 

47     int fun(int);   //函数,下面定义函数指针

48     int (*ffun)(int); //以前的方法

49     auto f1(int)->int(*)(int);  //用auto

50     decltype(fun)* f2(int);   //用decltype

51     decltype(x) z = i;

52 

53     z=1986;

54 

55     cout<<i<<endl;     // i=1986

 

你可能感兴趣的:(type)