Класс std::vector<T>
является моделью концепции контейнера STL, и поэтому любая надлежащая реализация вектора должна включать вложенный typedef value_type
, а также reference
.Это должно быть обнаружено с помощью SFINAE.Однако в моих собственных тестах я могу использовать SFINAE для определения вложенной value_type
typedef, но по какой-то причине я не могу обнаружить 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_type
на reference
, например:
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
?