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)

次に、2 番目の呼び出しで基本テンプレートが呼び出されます。がと同等であるとすると、int const& xが と同等であると仮定するのはconst int& x間違っていますか? 最初のバージョンは適切に解決され、2 番目のバージョンは解決されないのはなぜですか?T* const&const T*&

4

2 に答える 2

5

はい、あなたは間違っています。Tはconst 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 = S。あなたが持っているものはさらに悪いです、すなわちS = U const *T = U *

于 2012-08-03T07:17:59.090 に答える