#include <iostream>
#include <type_traits>
using namespace std;
template<typename T>
constexpr auto is_pure_input_iterator(int) ->
conditional_t
<
is_convertible_v
<
iterator_traits<T>::iterator_category,
input_iterator_tag
>,
true_type, false_type
>;
template<typename>
constexpr false_type is_pure_input_iterator(...);
int main()
{
cout << boolalpha
<< decltype(is_pure_input_iterator<istream_iterator<int>>(0))::value
<< endl;
return {};
}
Ожидаемый результат должен быть: true
, но актуальным является false
.Почему SFINAE работает не так, как ожидалось в этом примере?
Что не так в моем коде?
Должно быть 'typename iterator_traits :: iterator_category'. В противном случае эта версия C++ 14-ed http://coliru.stacked-crooked.com/a/461c077a5cb8fcbc отлично подходит для меня: выводит «истина». –
AnT
Кроме того, true_type, повторяемый дважды, кажется опечаткой. – Eugene
Почему вы не используете этот простой код 'std :: is_convertible :: iterator_category, std :: input_iterator_tag>'. Это даст предупреждение, когда вы забыли имя_файла –
Danh