Вопрос

Класс 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 стандарта гласит:

<цитата>

Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top