Wording for decay, make_pair and make_tuple

Author: Thorsten Ottosen
Contact: thorsten.ottosen@dezide.com
organizations:Dezide Aps
Date: 2006-04-18
Number:WG21/N2244 J16/07-0104
Working Group:Library

Abstract

This paper provides wording for the type-trait decay and new wording for the functions make_pair of make_tuple to make them optimally efficient. This change was motivated in n2069.

Table of Contents

1   Introduction

Each numbered section below describes a new section for the standard or modifications to an existing section. Comments are written in bold and are not part of the wording.

The author would like to thank Douglas Gregor and Howard Hinnant. Any mistake is the responsibility of the author.

2   Wording

Extend the synopsis of 20.4.2 to include the following

template <class T> struct decay;

Add the following row to Table 46 (Other transformations):

Template Condition Comments
template <class T> struct decay;   Let U be remove_reference<T>::type. If is_array<U>::value is true, the member typedef type shall equal remove_extent<U>::type*. If is_function<U>::value is true, the member typedef type shall equal add_pointer<U>::type. Otherwise the member typedef type equals U.

Modify make_pair() in the synopsis of 20.2 to read

template<class T1, class T2> 
pair< typename decay<T1>::type, typename decay<T2>::type > make_pair(T1&&, T2&&);

Modify the specification of make_pair() in 20.2.2 to read

template<class T1, class T2> 
pair< typename decay<T1>::type, typename decay<T2>::type > make_pair(T1&& x, T2&& y);

Returns: pair< typename decay<T1>::type, typename decay<T2>::type >( forward<T1>(x), forward<T2>(y) )

and remove the footnote 222.

Modify the specification of make_tuple() in 20.3.1.2 to read

template<class... Types>
tuple<VTypes...> make_tuple( Types&&... t);

where each Vi in VTypes is X& if for the corresponding type Ti in Types remove_cv< remove_reference<Ti>::type >::type equals reference_wrapper<X>, otherwise Vi is decay<Ti>::type.

Returns: tuple<VTypes...>(forward<Types>(t)...)