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) {
            return const_cast(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&),不是模板参数本身,别误以为能直接拿到 T
  • Clang 15+、GCC 13+、MSVC 19.34+ 支持;C++20 模式下不识别,必须启用 -std=c++23 或等效开关
  • 调试时栈帧里会显示显式参数名(如 self),而不是隐式的 this,部分调试器可能尚未完全适配显示

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

相关专题

更多
string转int
string转int

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

315

2023.08.02

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

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

1463

2023.10.24

if什么意思
if什么意思

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

736

2023.08.22

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

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

15

2025.11.27

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

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

521

2023.09.20

string转int
string转int

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

315

2023.08.02

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

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

537

2024.08.29

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

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

52

2025.08.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

0

2026.01.14

热门下载

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

精品课程

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

共94课时 | 6.6万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12万人学习

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

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