news 2026/10/2 10:50:38

【Effective Modern C++】第一章 类型推导:3. 理解 decltype

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Effective Modern C++】第一章 类型推导:3. 理解 decltype

个人认为原著写的非常晦涩难懂,所以精简如下:

decltype用于告知名字或表达式的类型:

const int i = 0; // decltype(i) 是 const int bool f(const Widget& w); // decltype(w) 是 const Widget&;decltype(f) 是 bool(const Widget&) struct Point { int x, y; }; // decltype(Point::x) 是 int;decltype(Point::y) 是 int Widget w; // decltype(w) 是 Widget if (f(w)) ... // decltype(f(w)) 是 bool template<typename T> // std::vector 的简化版 class vector { public: ... T& operator[](std::size_t index); ... }; vector<int> v; ... if (v[0] == 0) ... // decltype(v[0]) 是 int&

使用场景:当函数的返回类型依赖于参数类型时:我们不知道用户会传什么容器进来

// C++11的写法(尾置返回类型) template<typename Container, typename Index> auto authAndAccess(Container& c, Index i) -> decltype(c[i]) // 告诉编译器:返回类型就是c[i]的类型 { return c[i]; } // C++14的写法更简洁 template<typename Container, typename Index> decltype(auto) authAndAccess(Container& c, Index i) { return c[i]; // 编译器自动推导返回类型 }

我们希望这个函数返回容器元素,类型要和容器[]操作符返回的一致。但不同的容器,operator[]返回的类型可能不同:

  • vector<int>的operator[]返回int&
  • vector<bool>的operator[]返回一个特殊对象

和auto的区别:auto会去掉引用,decltype原样返回表达式的类型(引用/const会保留)。

decltype(auto):这是C++14的特性,意思是:

  • 用auto来自动类型推导
  • 但用decltype的规则来推导(保留引用)
    可以理解为保留引用/const的auto。

一个小陷阱:

// 括号的微妙影响 int x = 0; decltype(x) a = x; // int decltype((x)) b = x; // int&

总结

  • 绝大多数情况下,decltype会得出变量或表达式的类型而不作任何修改。
  • 对于类型为T的左值表达式,除非该表达式仅有一个名字,decltype总是得出类型T&。
  • C++14 支持decltype(auto),和auto一样,它会从其初始化表达式出发来。

原著在线阅读地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 12:48:26

5分钟快速上手:DeepSeek-R1-Distill-Qwen-1.5B免配置镜像使用教程

5分钟快速上手&#xff1a;DeepSeek-R1-Distill-Qwen-1.5B免配置镜像使用教程 1. 引言 在边缘计算和本地化部署日益普及的今天&#xff0c;如何在低资源设备上运行高性能大模型成为开发者关注的核心问题。DeepSeek-R1-Distill-Qwen-1.5B 正是在这一背景下诞生的“小钢炮”模型…

作者头像 李华
网站建设 2026/10/1 2:59:35

foobox-cn终极指南:快速打造你的专属音乐中心

foobox-cn终极指南&#xff1a;快速打造你的专属音乐中心 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在为杂乱无章的音乐文件而烦恼&#xff1f;想要一个既美观又实用的音乐播放器&#xff1f;…

作者头像 李华
网站建设 2026/9/30 17:02:38

基于SAM3大模型镜像实现文本引导万物分割|快速上手实践

基于SAM3大模型镜像实现文本引导万物分割&#xff5c;快速上手实践 1. 引言&#xff1a;从交互式分割到自然语言驱动的革新 图像分割是计算机视觉中的核心任务之一&#xff0c;传统方法依赖于人工标注边界框、点提示或掩码输入来完成目标提取。随着深度学习的发展&#xff0c…

作者头像 李华
网站建设 2026/10/1 7:47:39

OpenCore Legacy Patcher完整教程:零基础让老Mac重获新生的实操指南

OpenCore Legacy Patcher完整教程&#xff1a;零基础让老Mac重获新生的实操指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为那台陪伴多年的老Mac无法升级最新系…

作者头像 李华
网站建设 2026/9/26 16:31:49

ES6扩展运算符应用指南:项目实战解析

用好...这三个点&#xff0c;前端开发效率翻倍&#xff1a;ES6 扩展运算符实战精讲你有没有写过这样的代码&#xff1f;const newArr oldArr.concat(newItem);或者在 React 组件里这样透传属性&#xff1a;<input type"text" placeholder{props.placeholder}valu…

作者头像 李华
网站建设 2026/9/27 21:10:44

Paraformer转写实战:云端GPU 5分钟出结果,3块钱搞定一天工作

Paraformer转写实战&#xff1a;云端GPU 5分钟出结果&#xff0c;3块钱搞定一天工作 你是不是也遇到过这种情况&#xff1f;作为自媒体运营者&#xff0c;手头有大量视频素材需要加字幕&#xff0c;但自己的电脑配置太低&#xff0c;跑不动那些最新的AI语音识别模型。找外包吧…

作者头像 李华