0

0

C++如何使用std::common_reference推导公共引用类型?(迭代器适配)

尼克

尼克

发布时间:2026-02-18 16:13:59

|

428人浏览过

|

来源于php中文网

原创

std::common_reference用于为满足common_reference_with概念的类型对推导共同引用类型,典型应用于迭代器适配器中统一value_type的引用行为,如将const t&和t&&映射到const t&。

c++如何使用std::common_reference推导公共引用类型?(迭代器适配)

std::common_reference 是干啥的?

它不是用来“推导引用类型”的万能工具,而是为满足 std::common_reference_with 概念的一对类型找一个共同的、可绑定的引用类型——典型场景是迭代器适配器里要统一 value_type 的引用行为,比如把 const T&T&& 映射到 const T&

常见错误现象:std::common_reference<t const u>::type</t> 编译失败,不是因为写错了,而是这两者根本没定义公共引用(比如 TU 不相关,或 cv 限定不兼容)。

使用场景集中在:

  • 自定义迭代器的 reference 类型推导(尤其配合 std::ranges::iterator_t
  • 实现类似 zip_view 这种多迭代器组合时,统一解引用结果的引用类别
  • 写泛型算法时想安全地声明“我能接受任意可共引用的 pair”

注意:它依赖 ADL 可见的 common_reference 特化,标准库只对基础引用组合(如 T&/const T&T&/T&&)提供默认支持;自定义类型必须显式特化 std::basic_common_reference 才能参与推导。

立即学习C++免费学习笔记(深入)”;

怎么用 std::common_reference 推出迭代器的 reference?

别直接套 std::common_reference,先确认你的迭代器是否满足 indirectly_readable,再用标准约定:
std::iter_reference_t<it></it> 是首选,它内部已整合了 std::common_reference 逻辑。

Unreal Images
Unreal Images

免费的AI图片库

下载

实操建议:

  • 对单个迭代器类型 It,用 std::iter_reference_t<it></it>,它会自动处理 value_typereferencepointer 的一致性
  • 对两个不同迭代器 It1, It2,需要它们解引用后类型可共引用,写成:std::common_reference_t<:iter_reference_t>, std::iter_reference_t<it2>></it2></:iter_reference_t>
  • 如果编译失败,大概率是其中一个迭代器没正确定义 reference 成员(比如返回了 void 或裸值),或 value_type 不一致且无隐式转换
template<class It1, class It2>
using zip_reference = std::common_reference_t<
    std::iter_reference_t<It1>,
    std::iter_reference_t<It2>
>;

为什么 std::common_reference_t 不总是 T const&?

它确实通常是 const T&,但前提是 T 是完整类型、非 void、且未被显式禁用。容易踩的坑:

  • T 是不完整类型(比如在类定义体内提前使用),std::common_reference 无法实例化
  • Tvoid 或函数类型,标准禁止对其形成引用,推导直接 SFINAE 失败
  • 你特化了 std::basic_common_reference 但忘了加 template<class...> class</class...> 参数包,导致匹配不到
  • 编译器版本太低(GCC

性能影响几乎为零:这只是编译期类型计算,不生成运行时代码。但滥用会导致模板膨胀——比如在深度嵌套的 view 适配中反复推导,可能拖慢编译。

自定义类型怎么让它参与 common_reference 推导?

必须显式特化 std::basic_common_reference,不能靠 auto 或 deduction guide。

实操要点:

  • 特化必须在命名空间 std 内,且针对具体 cv/ref 组合(如 T&const U&
  • 第三个模板参数是 std::common_reference_t<t u></t> 的 fallback,通常设为 void 表示不支持
  • 要同时特化所有你希望支持的组合,比如 T&/U&&const T&/U& 等,否则推导链会断
namespace std {
template<class T, class U>
struct basic_common_reference<my_wrapper<T>&, my_wrapper<U> const&, T&, U const&> {
    using type = my_wrapper<std::common_reference_t<T&, U const&>>&;
};
}

复杂点在于:一旦开始特化,就得覆盖所有预期组合,漏一个就可能让整个 view 链失效;而且特化必须在所有使用前可见,头文件组织很容易出错。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

547

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

115

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

645

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

21

2025.12.06

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

455

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

165

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

90

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.7万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号