ごめん、成功時にnothrow swap を使うんだと想定してた。
俺だけか?
こんなふうに。

template< typename InputIterator , typename ForwardIterator >
ForwardIterator strong_copy( InputIterator first , InputIterator last , ForwardIterator result )
{
typedef typename std::iterator_traits< ForwardIterator >::value_type value_type;
std::vector< value_type > backup;
ForwardIterator const result_first = result;
try
{
while( first != last )
{
backup.push_back( *first );
++result;
++first;
}
std::swap_ranges( backup.begin() , backup.end() , result_first );
return result;
}
catch( ... )
{
throw;
}
}