news 2026/4/18 12:25:45

【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/4/17 22:50:22

PDF补丁丁:5个字体嵌入技巧让文档跨平台无忧

PDF补丁丁&#xff1a;5个字体嵌入技巧让文档跨平台无忧 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱&#xff0c;可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档&#xff0c;探查文档结构&#xff0c;提取图片、转成图片等等 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/4/17 22:49:24

AtlasOS视觉定制完全指南:打造专属桌面体验

AtlasOS视觉定制完全指南&#xff1a;打造专属桌面体验 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atlas …

作者头像 李华
网站建设 2026/4/17 22:46:01

Qwen CLI实战宝典:从零精通通义千问命令行工具

Qwen CLI实战宝典&#xff1a;从零精通通义千问命令行工具 【免费下载链接】Qwen The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen 还在为复杂的…

作者头像 李华
网站建设 2026/4/18 0:30:55

Arduino UNO下载快速理解:5分钟掌握核心工作流程

Arduino UNO 下载机制揭秘&#xff1a;5分钟搞懂“一键上传”背后的技术真相 你有没有想过&#xff0c;为什么在 Arduino IDE 里点一下“上传”&#xff0c;代码就能自动烧录进芯片&#xff1f;这个看似简单的操作背后&#xff0c;其实藏着一套精密协作的硬件与软件系统。 如…

作者头像 李华
网站建设 2026/4/18 0:26:59

MGeo+Faiss组合拳:百万地址去重方案揭秘

MGeoFaiss组合拳&#xff1a;百万地址去重方案揭秘 1. 引言&#xff1a;中文地址去重的工程挑战与破局思路 在电商、物流、本地生活等数据密集型业务中&#xff0c;用户收货地址、商户注册地址、配送网点等信息往往存在大量重复或近似条目。例如&#xff0c;“北京市朝阳区望…

作者头像 李华
网站建设 2026/4/18 0:26:51

OpenCode环境变量配置:打造你的专属AI编程伙伴

OpenCode环境变量配置&#xff1a;打造你的专属AI编程伙伴 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 还记得第一次使用AI编程助手时…

作者头像 李华