-4
template<class T, class U>
struct is_convertible
{
    typedef char yes;
    typedef struct
    {char _[2];}no;

    static yes test(U);
    static no test(...);
    enum {value = (sizeof(test(0)) == sizeof(yes)) ? 1 : 0};
//THE PART I'M INTERESTED IN IS (test(0)). Why 0 (zero) works here?

};

コード内のコメントを参照してください。

4

1 に答える 1

5

コードは、仕様を満たしている場合に「機能」します。

このコードは、関数名で示されている仕様を満たしていないため、より明確な仕様は示されていません。

現在、コードは、がコピー可能で、 fromまたは任意のポインタのコンテキストに暗黙の変換が存在するis_convertible<T, U>::value場合にtrueを返し、がコピー構築可能でない場合はコンパイルされない場合があり、それ以外の場合はfalseになります。Ustruct is_convertibleintUU

名前と既存のコードの組み合わせに基づく想定される仕様は、が(のコンテキストで)コピー構築可能であり、タイプの値が(のコンテキストで)暗黙的に変換可能でis_convertible<T, U>::valueある場合に真である必要があります。Ustruct is_convertibleTstruct is_convertibleU

コードを暗黙の仕様に合わせるには、わずかな変更が必要です。

enum {value = (sizeof(test(*(T*)0)) == sizeof(yes)) ? 1 : 0};
于 2011-03-05T15:48:03.630 に答える