• C++11:02decltype关键字


    decltype

    0、课前秀

    • 获取表达式的“声明类型”(Declared Type),所以命名为decltpe
    • 思考:typeid与decltype的异同
      • typeid用于返回指针或引用所指对象的实际类型。

    1、获知表达式的类型

    • 在编译时推导出一个表达式的类型,参考sizeof
    • 理解以下代码
    int x = 0;
    decltype(x) y = 1;  //y -> int
    decltype(x+y) z = 0; //z->int
    
    const int& i = 1;
    decltype(i) j = y; //j -> const int &
    
    const decltype(z) *p = &z;  //*p -> const int, p->const int *
    decltype(z)* pi = &z;  // *pi ->int, pi->int*
    decltype(pi)* pp = π // *pp ->int*, pp->int**
    

    2、decltype的推导规则

    • 规则1:exp是标识符、类访问表达式,decltype(exp)和exp的类型一致。
      • int i = 0; decltype(i) x = 0;
    • 规则2:exp是函数调用,decltype(exp)和返回值的类型一致
      • int add(int ,int ); decltype(add());
    • 规则3:其它情况,若exp是一个左值,则decltype(exp)是exp类型的左值引用,否则和exp类型一致。
    struct Foo {int x;};
    decltype(foo.x) a = 0; // a->int
    // 左值就是左值引用,右值,就是原类型
    decltype((foo.x)) b = a; // b->const int &  
    

    3、decltype的实际应用

    • 初学,体会不深
    • 作者讲得例子理解不深,但我倒想到一个例子,sum(T1 x, T2 y),返回值到底用哪个的问题,现在可以类型推导了。

    4、其它知识点

    • 使用decltype进行推导时,其成员不会继承const或volatile限制符

    5、总结

    • 在非泛型编程中,我们不用对类型进行推导,因为任何表达式中变量的类型都是明确的,而运算、函数调用等也都有明确的返回类型。在泛型编程中,类型成了未知数
      • add (T a1, Y a2);//两个不同的类型,add()的返回值类型怎么写?在这种情况下产生了类型推导。
    • decltype和auto异同

    ReadMe

    • 1、 20200420第1版:参考《深入应用C++11》1.1.2的内容
      • 第3节“实际应用”理解得不深
  • 相关阅读:
    单链表
    找最长最短字符串
    注解
    Json字符串
    java的反射机制
    java类的加载与加载器
    String StringBuilder StringBuffer
    查看运行某类时当前的进程状态
    迷宫小游戏
    类的初始化过程、super关键字与函数绑定
  • 原文地址:https://www.cnblogs.com/fewolflion/p/12747397.html
Copyright © 2020-2023  润新知