テンプレートとより特化したオーバーロードが与えられた場合:
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)
次に、2 番目の呼び出しで基本テンプレートが呼び出されます。がと同等であるとすると、int const& x
が と同等であると仮定するのはconst int& x
間違っていますか? 最初のバージョンは適切に解決され、2 番目のバージョンは解決されないのはなぜですか?T* const&
const T*&