过载功能使用规范

Specification of use of overloaded function

本文关键字:功能      更新时间:2023-10-16
template <typename T>
class Obj {
public:
Obj<T>* doThis();
const Obj<T>* doThis() const {// return normal version of doThis()}
};

在示例中,我希望doThis()的 const 版本返回doThis()的正常版本。我认为只return doThis()定义 const 版本的doThis()是不行的,因为C++可能认为这是doThis()的 const 版本的递归。

有没有办法明确告诉C++调用哪个函数?

正如 Story Teller 在评论中提到的,不要这样做,因为这可能会导致 UB,例如,在这个简单的情况下:

const Obj<int> obj;
obj.doThis(); // UB since you will have to const_cast<Obj<int>&>(obj).

正确的做法是另一种方式:

template <typename T>
class Obj {
public:
Obj<T>* doThis() {
return const_cast<Obj<T>*>(std::as_const(*this).doThis());
}
const Obj<T>* doThis() const { /* Actual implementation. */ }
};

请注意,这意味着doThis() const的返回值可以安全地const_castObj<T>*(例如,如果您在doThis中返回this,这是安全的(。

如果无法在const限定版本中实现doThis(),则代码可能存在缺陷。