调用者如何知道应调用哪些同名成员函数

How does caller know which member functions of same name shall be called

我今天看到下面的代码。

我知道返回引用和返回常量引用的区别。

但是不知道什么时候会调用T& operator()*,什么时候会调用const T& operator()const* 将被调用。

他们同名。

template<typename T>
class CSmartPtr
{
public:
    CSmartPtr(T *ptr = nullptr) :mptr(ptr) {}
    ~CSmartPtr() { delete mptr; }

    T& operator*() { return *mptr; }
    const T& operator*()const { return *mptr; }

private:
    T *mptr;
};
int main()
{
    CSmartPtr<int> ptr(new int);
    *ptr = 20;
    cout << *ptr << endl;
    return 0;
}

But I don't know when T& operator()* will be called, and when const T& operator()const* will be called.

They have the same name.

在这种情况下,如果在const对象上调用成员函数,会调用const方法,non-const方法会调用non-const对象。

How does caller know which member functions of same name shall be called?

他们不知道,他们也不应该知道。重载集的全部意义在于调用者不知道调用了哪个确切的重载。这是一个实现细节。调用者从重载集调用函数时应使用相同的语法。

重载集的作者根据调用函数的参数来完成正确的事情。

如果您确实希望调用者知道调用了哪个函数,那么根本不要使用重载集,只需提供不同名称的函数即可。