4

このstd::vector<T>クラスはSTLコンテナの概念のモデルであるため、vectorを適切に実装するには、ネストされたtypedefとを含める必要がありvalue_typeますreference。これは、SFINAEを使用して検出できるはずです。ただし、私自身のテストでは、SFINAEを使用してネストされたvalue_typetypedefを検出できますが、何らかの理由で検出できませんreference

template <class T> 
typename T::value_type* test(T)
{
    cout << "Has nested typedef!" << endl;
}

template <class T> 
void test(...)
{
    cout << "Doesn't have nested typedef!" << endl;
}

int main()
{
    test(std::vector<int>());
}

これは以下を出力します:Has nested typedef!

ただし、次のように置き換えるvalue_typereference、次のようになります。

template <class T> 
typename T::reference* test(T)
{
    cout << "Has nested typedef!" << endl;
}

template <class T> 
void test(...)
{
    cout << "Doesn't have nested typedef!" << endl;
}

int main()
{
    test(std::vector<int>());
}

...プログラムはまったくコンパイルに失敗し、エラーが発生します:error: no matching function for call to test(std::vector<int, std::allocator<int> >)

SFINAEテクニックが機能するのに機能しないのはなぜT::value_typeですかT::reference

4

2 に答える 2

5

参照へのポインタとは何ですか?

A:できません。参照へのポインターは存在できないため、どちらの関数も存在できません。これは、少なくとも 1 つの関数が存在できる最初のケースとは対照的です (したがって、コンパイル、リンケージ、および出力が得られます)。

興味深いことに、関数定義がコンパイル エラーを引き起こしていないため、ここでSFINAEが機能しています。不可能+SFIN​​AEのために存在しない関数を呼び出そうとしているため、エラーが発生しています。:)

于 2011-04-30T01:44:43.670 に答える
2

タイプ名 T::参照* テスト(T)

C++ では、参照へのポインタは不正です。

標準の §8.3.2/4 は次のように述べています。

参照への参照、参照の配列、および参照へのポインタがあってはなりません。

于 2011-04-30T02:20:26.180 に答える