1// PR c++/46105
2
3template< typename T >
4struct empty { // support class is like stripped-down enable_if
5    typedef void type;
6};
7
8template< class T, typename v = void > // v is always void!
9struct element {
10    typedef typename T::value_type type;
11};
12
13template< class T > // T in deduced context, T::element_type is SFINAE:
14struct element< T, typename empty< typename T::element_type >::type > {
15    typedef typename T::element_type type;
16};
17
18template< class T >
19struct element< T const, typename empty< typename T::element_type >::type > {
20    typedef typename T::element_type const type;
21};
22
23struct has_et {
24    typedef int element_type;
25};
26
27element<has_et const>::type ip = 0;
28