#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はうまく動作します。出力は 'true'です。 –
AnT
また、true_typeが2回繰り返されるのは誤字のようです。 – Eugene
なぜこの単純なコード 'std :: is_convertible :: iterator_category、std :: input_iterator_tag>'を使わないのですか?あなたがtypenameを忘れたときに警告を出します –
Danh