给出一个模板和一个更专业的重载:
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*&
,我是否错误?为什么第一个版本正确解析而第二个版本没有解决?
答案 0 :(得分:5)
是的,你是不对的。在const T*&
中,T是const,在T* const&
中,指针(T *)是常量。
当您将const
移至*
右侧时,会发生更改。 const T*&
和T const *&
相同,但T* const&
不同。给定
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 *
。