0

0

c++23的Deducing this是什么,如何改变类成员函数的设计? (显式对象参数)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-14 10:31:02

|

329人浏览过

|

来源于php中文网

原创

deducing this是c++23引入的语法,将成员函数隐式this参数显式化为带类型占位符的形参,支持对cv/ref限定符进行模板推导;基本形式为在参数列表首位写this auto& self等。

c++23的deducing this是什么,如何改变类成员函数的设计? (显式对象参数)

什么是 deducing this(显式对象参数)

这是 C++23 引入的语法,允许把成员函数的第一个隐式 this 参数写成显式的、带类型占位符的形参,从而让编译器能对 this 的 cv/ref 限定(如 const&&)做模板参数推导。它不是“重载 this”,而是把原本隐式绑定的对象,变成可参与模板推导的普通形参。

怎么写显式对象参数的成员函数

基本形式是:在函数声明中把 this 拿出来,写在参数列表最前面,类型用 auto& 或更精确的 MyClass& 等,支持 constvolatile、引用限定符;若用 auto,就触发推导。

struct Vec {
    int x = 0;

    // 显式对象参数 + auto → deducing this
    void print(this auto& self) {
        std::cout << "x = " << self.x << "\n";
    }

    // 也可限定 const
    int get(this const auto& self) const { return self.x; }

    // 支持右值限定(注意:this 后面的 && 是函数的引用限定符,不是参数的)
    void consume(this Vec&& self) { x = -1; }
};
  • this auto& 表示“接受任意 cv/ref 限定的 Vec 对象,并推导其完整类型”
  • 不能写 this auto self(必须带引用,因为 this 总是引用语义)
  • 显式对象参数必须是第一个参数,且只能有一个
  • 仍可有其他普通参数,例如 void set(this auto& self, int v)

它如何改变成员函数重载与设计习惯

以前靠 const/non-const 成员函数重载区分读写权限,现在可以用一个 auto& 函数覆盖多种情况,再用 if constexpr 分支处理逻辑差异——尤其适合通用工具类或需要精细控制 cv/ref 行为的场景。

struct Box {
    std::string data;

    // 替代 const 和 non-const 两个版本
    std::string& get(this auto& self) {
        if constexpr (std::is_const_v<decltype(self)>) {
            return const_cast<std::string&>(self.data);
        } else {
            return self.data;
        }
    }
};
  • 旧写法要定义 const std::string& get() conststd::string& get() 两份
  • 新写法只需一份,但要注意:返回非常量引用给 const 对象需显式 const_cast,否则编译失败
  • 无法替代所有重载:比如想对 Box&& 做移动优化,仍需单独写右值引用限定函数(this Box&&),因为 auto& 不会匹配纯右值
  • 显式对象参数函数不参与 ADL(除非显式指定作用域),这点和普通成员函数一致

容易踩的坑和兼容性注意点

这不是“语法糖”,它的行为和传统成员函数有实质差异:对象参数参与模板实例化,可能造成意外的函数模板膨胀,也可能因推导出太具体的类型而失去多态性。

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

  • 不能在虚函数中使用 this auto& —— 虚函数要求签名完全一致,而 auto 推导后每个调用点生成不同函数,无法构成虚函数重写
  • 类模板中使用时,this auto& 推导的是具体特化类型(如 Vec<int>&</int>),不是模板参数本身,别误以为能直接拿到 T
  • Clang 15+、GCC 13+、MSVC 19.34+ 支持;C++20 模式下不识别,必须启用 -std=c++23 或等效开关
  • 调试时栈帧里会显示显式参数名(如 self),而不是隐式的 this,部分调试器可能尚未完全适配显示

真正关键的转变在于:你开始把“调用者对象”当作一个可推导、可约束、可 if constexpr 分支的输入,而不是语言强加的隐式上下文。这在写泛型容器适配器或 fluent 接口时特别有用,但也意味着你得更小心地控制推导边界——毕竟,auto 不会自动理解你的设计意图。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

838

2023.08.22

java多态详细介绍
java多态详细介绍

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

27

2025.11.27

c语言const用法
c语言const用法

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

557

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

595

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20万人学习

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

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