#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版的http://coliru.stacked-crooked.com/a/461c077a5cb8fcbc對我來說效果很好:輸出'true'。 –
AnT
另外,兩次重複的true_type似乎是一個錯字。 – Eugene
爲什麼不使用這個簡單的代碼'std :: is_convertible :: iterator_category,std :: input_iterator_tag>'。它會在您忘記輸入名稱時發出警告 –
Danh