当前位置: 首页 > news >正文

C++11 auto decltype

一、auto 关键字

作用

auto 允许编译器根据变量的初始化表达式自动推导其类型,无需显式指定。

C++11 的改进
  1. 基本用法

    auto x = 5;           // x 推导为 int
    auto y = 3.14;        // y 推导为 double
    auto str = "hello";   // str 推导为 const char*
  2. 推导规则

    • auto 会忽略顶层 const 和引用,但保留底层 const
      const int a = 10;
      auto b = a;         // b 类型为 int(忽略顶层 const)
      const auto c = a;   // c 类型为 const int
      
      int& ref = x;
      auto d = ref;       // d 类型为 int(忽略引用)
      auto& e = ref;      // e 类型为 int&(显式保留引用)
  3. 常见应用场景

    • 简化迭代器声明
      std::vector<int> vec{1, 2, 3};
      for (auto it = vec.begin(); it != vec.end(); ++it) { /* ... */ }
    • 范围 for 循环
      for (auto& elem : vec) { elem *= 2; } // 修改容器元素
    • 泛型编程
      template <typename T, typename U>
      auto add(T t, U u) -> decltype(t + u) { return t + u; }
  4. 注意事项

    • auto 变量必须初始化:
      auto value; // 错误:无法推导类型
    • 避免推导为不期望的类型(如 std::initializer_list):
      auto list = {1, 2, 3}; // list 类型为 std::initializer_list<int>
      //该问题在C++17中得到了修复

二、decltype 关键字

作用

decltype(expr) 返回表达式 expr 的类型,保留顶层 const 和引用,且不计算 expr 的值。

将变量的类型声明为表达式指定的类型。
C++98 的局限性
  • 无法直接获取表达式的类型,需依赖类型萃取(如 typeid,但丢失类型信息)。
C++11 的改进
  1. 基本用法

    int x = 5;
    const int& rx = x;
    decltype(x) a = x;       // a 类型为 int
    decltype(rx) b = x;      // b 类型为 const int&
    decltype(5 + 3.14) c;    // c 类型为 double
  2. 推导规则

    • 若 expr 是变量:返回变量声明类型(包括 const 和引用)。
    • 若 expr 是表达式:返回表达式的结果类型(保留值类别和 const):
      int i = 0;
      int* p = &i;
      decltype(*p) d = i;    // d 类型为 int&(解引用操作返回左值)
      decltype(i + 0) e;     // e 类型为 int(表达式结果为纯右值)
  3. 常见应用场景

    • 函数返回类型后置​(结合 auto):
      template <typename T, typename U>
      auto add(T t, U u) -> decltype(t + u) { return t + u; }
    • 模板元编程
      template <typename T>
      auto clone(const T& obj) -> decltype(new T(obj)) {
          return new T(obj);
      }
    • 保留引用和 const
      const std::vector<int> vec{1, 2, 3};
      decltype(vec)::value_type x = vec[0]; // x 类型为 const int
  4. 与 auto 的对比

    特性autodecltype
    推导依据初始化表达式任意表达式或变量
    是否计算表达式需要初始化(计算)不计算表达式
    const 和引用处理忽略顶层 const 和引用保留所有修饰符

在C++中,-> 符号在函数声明中用于 ​后置返回类型语法,它允许你将函数的返回类型写在参数列表之后。这种写法主要用于以下场景:

当函数的返回类型依赖于参数时,传统的返回类型前置写法无法直接表达,例如:

// 传统写法(错误示例):返回类型需要用到参数 t 和 u,但此时它们尚未声明!
decltype(t + u) add(T t, U u) { ... } // 编译报错

通过后置语法,可以先用 auto 占位返回类型,再用 -> 指定实际类型:

// 正确写法:返回类型后置
auto add(T t, U u) -> decltype(t + u) { ... }

三、声明相关改进

1. ​类型别名模板 (using)
  • C++98:仅支持 typedef,无法直接定义模板别名。
    typedef std::map<std::string, int> StringIntMap; // 普通类型别名
  • C++11:支持 using 定义模板别名,更清晰且支持模板参数:
    template <typename T>
    using Vec = std::vector<T>; // 模板别名
    Vec<int> vec{1, 2, 3};
2. ​范围 for 循环
std::vector<int> vec{1, 2, 3};
for (auto& val : vec) { val *= 2; }
3. ​委托构造函数
  • C++98:构造函数无法直接调用其他构造函数。
  • C++11:允许构造函数委托:
    class Widget {
    public:
        Widget(int x) : x_(x) {}
        Widget() : Widget(0) {} // 委托给 Widget(int)
    private:
        int x_;
    };

四、对比总结

特性C++98C++11
变量类型声明必须显式指定支持 auto 自动推导
类型推导无直接支持decltype 可推导任意表达式类型
模板别名typedef 不支持模板参数using 支持模板别名
容器遍历迭代器显式遍历范围 for 循环直接访问元素
构造函数复用无法委托支持构造函数委托

五、注意事项

  1. auto 推导陷阱

    auto x = {1}; // x 类型为 std::initializer_list<int>
    auto y{1};    // C++11 中推导为 std::initializer_list<int>
                 // C++17 修正为 int
  2. decltype 与变量名
    decltype(var) 返回变量声明类型,decltype((var)) 可能返回引用(若 var 是左值)。

  3. decltype(auto)(C++14)​:
    结合 auto 和 decltype 规则,保留所有修饰符:

    int x = 0;
    decltype(auto) a = x;   // a 类型为 int
    decltype(auto) b = (x); // b 类型为 int&

相关文章:

  • 未来工程项目管理新走向:云原生软件赋能绿色可持续建设
  • 【申论】二十大报告中的申论金词金句
  • 【AI News | 20250324】每日AI进展
  • 大数据学习(82)-数仓详解
  • 【Ratis】SlideWindow滑动窗口机制
  • unity动效扫光教程
  • Linux应用:异步IO、存储映射IO、显存的内存映射
  • 常见框架漏洞攻略-Shiro篇
  • Elasticsearch:构建 AI 驱动的搜索体验
  • 嵌入式八股RTOS与Linux---进程间的通信与同步篇
  • SQL 集合运算
  • 蓝桥与力扣刷题(蓝桥 回文判定)
  • AI 浪潮下的 IT 行业变革:机遇与挑战并存
  • 08.面向对象的特性
  • 【力扣刷题实战】搜索插入位置
  • 用API解锁大模型超能力——从零构建智能体到本地知识库全链路解析
  • FFmpeg6.1.1 MSYS2+GCC 源码编译
  • 在C++ Qt中集成Halcon窗口并实现跨平台兼容和大图加载
  • 手敲NLP相关神经网络,熟悉神经网络的结构与实现!
  • 数据类设计_图片类设计之9_图标类设计_C++实战_(前端架构)
  • 起底新型保健品电话销售诈骗:从快递信息中筛选对象,忽悠其高价买药
  • 溢价率19.48%,民企番禺置业3.07亿元竞得广州番禺融媒体中心北侧地块
  • 长三角9座“万亿城市”一季报出炉:多地机器人产量大增
  • 国内多景区实行一票游多日:从门票经济向多元化“链式经济”转型
  • 习近平给谢依特小学戍边支教西部计划志愿者服务队队员回信
  • 人民日报今日谈:为何重视这个“一体化”