news 2026/5/12 6:09:43

【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/5/9 23:54:38

163MusicLyrics:三分钟搞定歌词提取,新手也能轻松上手

163MusicLyrics&#xff1a;三分钟搞定歌词提取&#xff0c;新手也能轻松上手 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为听歌时找不到合适的歌词而烦恼吗&…

作者头像 李华
网站建设 2026/5/9 11:03:51

快速实现本地服务全球访问:tunnelto完整解决方案

快速实现本地服务全球访问&#xff1a;tunnelto完整解决方案 【免费下载链接】tunnelto Expose your local web server to the internet with a public URL. 项目地址: https://gitcode.com/GitHub_Trending/tu/tunnelto 在数字化协作日益普及的今天&#xff0c;开发者经…

作者头像 李华
网站建设 2026/5/10 9:32:39

Qwen3-Embedding-4B应用研究:跨模态检索系统设计

Qwen3-Embedding-4B应用研究&#xff1a;跨模态检索系统设计 1. 引言 随着多模态数据的爆炸式增长&#xff0c;如何高效地从海量异构信息中检索出相关结果成为智能系统的核心挑战。传统的单模态检索方法在面对图像、文本、代码等混合内容时表现受限&#xff0c;而跨模态检索技…

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

开源模型商业化路径:BERT填空服务SaaS化部署案例

开源模型商业化路径&#xff1a;BERT填空服务SaaS化部署案例 1. 引言&#xff1a;从开源模型到商业价值闭环 随着自然语言处理技术的成熟&#xff0c;以 BERT 为代表的预训练语言模型已不再是科研专属工具。越来越多企业开始探索如何将这些开源模型转化为可落地、可持续运营的…

作者头像 李华
网站建设 2026/5/10 18:17:11

Qwen3-VL-2B-Instruct快速上手:三步完成网页端调用部署

Qwen3-VL-2B-Instruct快速上手&#xff1a;三步完成网页端调用部署 1. 技术背景与核心价值 随着多模态大模型的快速发展&#xff0c;视觉-语言理解能力已成为AI系统实现真实世界交互的关键。Qwen3-VL-2B-Instruct作为阿里云开源的最新一代视觉语言模型&#xff0c;代表了当前…

作者头像 李华
网站建设 2026/5/10 18:17:45

OpenCore Legacy Patcher终极教程:让老款Mac焕发新生

OpenCore Legacy Patcher终极教程&#xff1a;让老款Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想要让您的老款Mac电脑也能运行最新版macOS系统吗&#x…

作者头像 李华