C++23的Deducting This特性是否应搭配模板函数使用?
你编写的非模板版本确实能正常编译运行,但微软博客选择模板实现,核心是因为模板版本能一次性适配更多场景、减少冗余代码,而非模板版本存在明显局限性,具体原因如下:
自动适配派生类
模板版本的Self会被推导为调用者的实际类型。比如如果有kitty继承自cat,调用kitty{}.get_held_toy()时,Self会推导为kitty,若派生类重定义了held_toy_,能直接访问派生类成员;而非模板版本硬绑定cat类型,只能访问基类的held_toy_,无法适配派生类的扩展场景。统一处理cv限定符
模板版本无需单独编写const/volatile/const volatile的重载。比如调用const cat c; c.get_held_toy();时,Self会推导为const cat,自动返回const toy&;而非模板版本要支持const对象,必须额外写一个重载:const toy& get_held_toy(this const cat& self) { return self.held_toy_; }模板版本通过推导
Self的cv属性,一次性覆盖所有cv组合,避免重复代码。完美覆盖所有值类别
模板版本的Self&&配合std::forward<Self>(self),能完美转发调用者的左值/右值属性。不管是左值cat c; c.get_held_toy()、右值cat{}.get_held_toy(),还是const左值/右值,一个模板函数就能全部处理;而非模板版本需要为cat&、cat&&、const cat&、const cat&&分别编写重载,代码量会成倍增加。契合Deducting This的设计初衷
C++23引入Deducting This的核心目的之一,就是消除传统成员函数需要编写大量重载的冗余代码。模板版本正是这个特性的最佳实践——用一个函数替代N个重载,简化代码维护成本。
内容的提问来源于stack exchange,提问作者lk.c

