SFINAE не обнаруживает T :: reference
Вопрос
Класс std::vector<T>
является моделью концепции контейнера STL, и поэтому любая правильная реализация вектора должна включать вложенный typedef value_type
, а также reference
.Это должно быть обнаружено с помощью SFINAE.Однако в моих собственных тестах я могу использовать SFINAE для обнаружения вложенного кода типа value_type
, но по какой-то причине я не могу обнаружить код reference
.
Это выводит: Has nested typedef!
Однако, если я заменю value_type
на reference
, например:
... программа не компилируется вообще, выдает ошибку: error: no matching function for call to test(std::vector<int, std::allocator<int> >)
Почему метод SFINAE работает с T::value_type
, но не работает с T::reference
?
Решение
Что означает указатель на ссылку?
A : невозможно.Указатели на ссылки не могут существовать, поэтому ни одна из ваших функций не может существовать.Это контрастирует с вашим первым случаем, где может существовать хотя бы одна из функций (и, таким образом, вы получаете компиляцию, связывание и вывод).
Интересно, что SFINAE работает здесь, поскольку определение функции не вызывает ошибку компиляции.Он пытается вызвать функцию, которая из-за невозможности + SFINAE не существует, что вызывает ошибку.:)
Другие советы
typename T :: reference * test (T)
Указатели на ссылки недопустимы в C ++.
§8.3.2 / 4 стандарта гласит:
<цитата>Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки .