The following code compiles fine with gcc and clang but gives an error with icc 2016.
#include <utility> struct A { using value_type = double; }; struct K { template<class T, class V = typename T::value_type> auto require(T&& x) -> std::true_type; }; template< class X , class Y, typename R = decltype(std::declval<X>().template require<Y>( std::declval<Y>()))> constexpr bool g() { return R::value; } int main() { g<K, A>(); return 0; }