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

时间:2012-08-03 07:10:27

标签: 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; 
}

然后以下工作正常:

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;
} 

第一次打印Called base template时,第二次打印Called T* overload。如果我们用:

替换过载签名
template <typename T>
const T*& some_func(const T*& a, const T*& b)

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

2 个答案:

答案 0 :(得分:5)

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

当您将const移至*右侧时,会发生更改。 const T*&T const *&相同,但T* const&不同。给定

,Typedef可以提供帮助
typedef T *TPtr;

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

C / C ++中的声明符很难解析(对于人类而言)。即使是C的发明者也是如此。

答案 1 :(得分:2)

T const &const T &相同; U const *const U *相同。

但即使S &T const &T = S 也不一样。你所拥有的更糟糕,即S = U const *T = U *