auto关键字&decltype关键字

auto关键字&decltype关键字

auto&decltype关键字用于进行类型推导,使其在编译期就能推导出变量或者表达式的类型。

  • auto: 让编译器在编译期间推导出变量类型,通过 = 右边的类型推导出 = 左边的变量类型。
    • 对于变量,指定要从它的初始化器自动推导出它的类型。
    • 对于函数,指定要从它的 return 语句推导出它的返回类型。(ps: C++14起)
    • 对于非类型模板形参,指定要从实参推导出它的类型。(ps: C++17起)
  • decltype: 相比于auto,decltype用于推导表达式类型。检查实体的声明类型,或表达式的类型和值类别。

auto使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>

using namespace std;

template<class T, class U>
auto add(T t, U u) -> decltype(t + u) //C++11 不加 -> decltype(t + u)会编译失败 C++14 auto才支持函数推导
{
return t + u;
} // 返回类型是 operator+(T, U) 的类型

int test(int a, int b)
{
return a * b;
}

int main()
{
auto a = 1 + 2;
auto b = add(2, 2);
auto c = add(2, 2.3);
auto d = {1.0, 2.0};
auto &e = a; //e为a的 引用
auto f = &e; //f为指向e 也就是a的 指针
auto g = "111", h = "222";
auto i = &f;//i是指向f的指针

auto (*p)(int, int) -> int; //声明p为一个 int (int, int)的函数
p = test;
//auto (*q)(int, int) -> auto = p;//声明 q 为指向【返回 T 的函数】的指针 其中 T 从 p 的类型推导 C++14 可用
//cout<<"q = "<<q(6, 6)<<endl;
cout<<"p = "<<p(3, 3)<<endl; //9

// auto x; // 在 C 合法,在 C++ 错误

e++;
*f = 30;

cout << "a = "<<a<<" addr = "<<&a<<" "<<typeid(a).name() << endl; //30
cout << typeid(b).name() << endl;//int
cout << typeid(c).name() << endl;//double
cout << typeid(d).name() << endl; //std::initializer_list<double>
cout << "e = "<<e<<" addr = "<<&e<<" "<<typeid(e).name() << endl; //30
cout << "f = "<<*f<<" addr = "<<f<<" "<<typeid(f).name() << endl; //30
cout << "g = "<<g<<" "<<typeid(g).name() << endl;
cout << "h = "<<h<<" "<<typeid(h).name() << endl; //类型为PKc pointer(P) const(K) char(c)
cout << "i = "<<**i<<" addr = "<<*i<<" "<<typeid(i).name() << endl;// PPi
}

decltype使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>

using namespace std;

struct A { double x; };
const A* a;

decltype(a->x) y; // y 的类型是 double(其声明类型)(右值表达式) a->x代表x的值
decltype((a->x)) z = 6.66; // z 的类型是 const double&(左值表达式) (a->x)代表double这个类型

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) // 返回类型依赖于模板形参
{
return t+u;
}

int main()
{
decltype(3 + 3) a = 6;
y = 5.55;
cout << "y = "<<y<<" addr = "<<&y<<" "<<typeid(y).name() << endl;

decltype(&y) p = new double;//p是 *double 但是为NULL 需要new
*p = 7.77;
cout << "p = "<<*p<<" addr = "<<p<<" "<<typeid(p).name() << endl;
delete p;

double* d = &y;
//(p) 为左值表达式
decltype((p)) q = d; //q 是 double *& 类型 指向double类型的指针的引用 不能直接赋值&y 因为&y为右值表达式
cout << "q = "<<*q<<" addr = "<<q<<" "<<typeid(q).name() << endl;

decltype(add(4, 5.0)) k = 8.88; //k的类型为double add(4, 5.0)为右值表达式
cout << "k = "<<k<<" addr = "<<&k<<" "<<typeid(k).name() << endl;

decltype((add(3, 6))) s = 10; //s的类型为int (add(3, 6))也为右值表达式
cout << "s = "<<s<<" addr = "<<&s<<" "<<typeid(s).name() << endl;

cout << "a = "<<a<<" addr = "<<&a<<" "<<typeid(a).name() << endl;
cout << "z = "<<z<<" addr = "<<&z<<" "<<typeid(z).name() << endl;
cout << "y = "<<y<<" addr = "<<&y<<" "<<typeid(y).name() << endl;
}
#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×