1

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

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*&吗?为什么第一个版本正确解析,而第二个版本没有?

4

2 回答 2

5

是的,你不正确。在const T*&T 中是 const,在T* const&指针 (T*) 中是 const。

当您const移到 的右侧时,就会发生变化*const T*&T const *&是等价的,但T* const&不同。鉴于 Typedefs 可以提供帮助

typedef T *TPtr;

const TPtr&等于TPtr const &等于T* const &

C/C++ 中的声明符很难解析(对于人类)。甚至 C 的发明者也是这么说的。

于 2012-08-03T07:11:51.533 回答
2

T const &并且const T &是相同的;和U const *const U *是相同的。

但是S &甚至对于. T const &_ 你所拥有的更糟糕,即和。T = SS = U const *T = U *

于 2012-08-03T07:17:59.090 回答