函数模板重载涉及指针的解析

Yuu*_*shi 1 c++ templates overloading

给定一个模板和一个更专业的重载:

template <typename T>
const T& some_func(const T& a, const T& b) 
{
    std::cout << "Called base template\n";
    return (a < b) ? a : b; 
}

template <typename T>
T* const& some_func(T* const& a, T* const& b) 
{
    std::cout << "Called T* overload\n";
    return (*a < *b) ? a : b; 
}
Run Code Online (Sandbox Code Playgroud)

然后以下按预期工作:

int main()
{
    std::cout << some_func(5.3, 6.2) << "\n";
    double a = 1;
    double b = 2;
    double *p = &a;
    double *q = &b;
    const double *ret = some_func(p, q); 
    std::cout << *ret << "\n";
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

随着第一次印刷Called base template,第二次印刷Called T* overload.如果我们用以下内容替换过载签名:

template <typename T>
const T*& some_func(const T*& a, const T*& b)
Run Code Online (Sandbox Code Playgroud)

然后第二个调用现在调用基本模板.鉴于这int const& x相当于const int& x,我假设T* const&是否相当于const T*&?为什么第一个版本正确解析而第二个版本没有解决?

jah*_*haj 5

是的,你是不对的.在const T*&T是const中,在T* const&指针(T*)中是const.

当你转移const到右边时,会发生变化*.const T*&并且T const *&是等同的但是T* const&是不同的.给定的Typedef可以提供帮助

typedef T *TPtr;
Run Code Online (Sandbox Code Playgroud)

const TPtr&相当于TPtr const &相当于T* const &.

C/C++中的声明符很难解析(对于人类而言).即使是C的发明者也这么说.