C++23引入deducing this,允许成员函数通过auto推导*this的类型,简化左值/右值、const/non-const重载。语法为void func(this auto& self),可统一处理不同对象形式,适用于泛型设计如日志、链式调用等场景,提升代码简洁性与通用性。

C++23 引入了 deducing this 这一重要特性,它允许成员函数的第一个参数显式地声明为 *this,并使用自动类型推导(如 auto)来推导调用对象的值类别和 cv 限定性。这一机制简化了对不同对象形式(左值/右值、const/non-const)的重载设计,使代码更简洁、通用。
传统 C++ 中,为了处理不同类型的调用者,需要编写多个重载版本:
struct MyType {
void func() &; // 只能被左值调用
void func() &&; // 只能被右值调用
void func() const&; // const 左值
};
这种方式冗长且难以扩展。C++23 的 deducing this 允许将 *this 作为隐式第一个参数进行类型推导:
struct MyType {
void func(this auto& self) {
// self 的类型包含完整的调用者信息
// 包括值类别和 const/volatile 属性
}
};
这里 this auto& self 表示:让 self 的类型根据实际调用对象自动推导,保留其所有属性。
立即学习“C++免费学习笔记(深入)”;
该特性特别适用于泛型成员函数设计,比如实现通用的日志记录、链式调用或访问控制:
struct Logger {
auto log(this auto& self, std::string_view msg) {
std::cout << "[LOG] " << msg << "\n";
return self; // 返回原对象,保持值类别
}
};
Logger{} .log("temp"); // 右值调用,返回右值
Logger l; l.log("named"); // 左值调用,返回左值
相比手动编写四个版本(& / && / const& / const&&),deducing this 显著减少样板代码:
例如可判断当前是否处于 const 上下文:
template<typename T>
void access(this T& self) {
if constexpr (std::is_const_v<T>) {
// 只读操作
} else {
// 允许修改
}
}
以上就是C++23的deducing this是什么_C++中允许在成员函数中推导*this的类型的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号