Date
2011-04-30.23:09:42
Message id
5397

Content

Proposed resolution:

  1. Change [tuple.general] p.2, header <tuple> synopsis, as indicated:
    // 20.4.2.5, tuple helper classes:
    template <class T> class tuple_size; // undefined
    template <class T> class tuple_size<const T>;
    template <class T> class tuple_size<volatile T>;
    template <class T> class tuple_size<const volatile T>;
    
    template <class... Types> class tuple_size<tuple<Types...> >;
    	
    template <size_t I, class T> class tuple_element; // undefined
    template <size_t I, class T> class tuple_element<I, const T>;
    template <size_t I, class T> class tuple_element<I, volatile T>;
    template <size_t I, class T> class tuple_element<I, const volatile T>;
    
    template <size_t I, class... Types> class tuple_element<I, tuple<Types...> >;
    
  2. Add the end of subclause [tuple.helper] insert the following two paragraphs:
    template <class T> class tuple_size<const T>;
    template <class T> class tuple_size<volatile T>;
    template <class T> class tuple_size<const volatile T>;
    

    Let TS denote tuple_size<T> of the cv-unqualified type T. Then each of the three templates shall meet the UnaryTypeTrait requirements (20.7.1) with a BaseCharacteristic of integral_constant<remove_cv<decltype(TS::value)>::type, TS::value>.

    template <size_t I, class T> class tuple_element<I, const T>;
    template <size_t I, class T> class tuple_element<I, volatile T>;
    template <size_t I, class T> class tuple_element<I, const volatile T>;
    

    Let TE denote tuple_element<I, T> of the cv-unqualified type T. Then each of the three templates shall meet the TransformationTrait requirements (20.7.1) with a member typedef type that shall name the same type as the following type:

    • for the first specialization, the type add_const<TE::type>::type,
    • for the second specialization, the type add_volatile<TE::type>::type, and
    • for the third specialization, the type add_cv<TE::type>::type