mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	
		
			
	
	
		
			64 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
|  | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 | ||
|  |  Problem with ``reference`` and old/new iterator category correspondance
 | ||
|  | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 | ||
|  | 
 | ||
|  | .. _N1550: http://www.boost-consulting.com/writing/n1550.html
 | ||
|  | .. _N1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html
 | ||
|  | 
 | ||
|  | :Author: David Abrahams and Jeremy Siek
 | ||
|  | :Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
 | ||
|  | :Organization: `Boost Consulting`_, Indiana University Bloomington
 | ||
|  | :date: $Date$
 | ||
|  | :Copyright: Copyright David Abrahams, Jeremy Siek 2003. Use, modification and
 | ||
|  |       distribution is subject to the Boost Software License,
 | ||
|  |       Version 1.0. (See accompanying file LICENSE_1_0.txt or copy
 | ||
|  |       at http://www.boost.org/LICENSE_1_0.txt)
 | ||
|  | 
 | ||
|  | .. _`Boost Consulting`: http://www.boost-consulting.com
 | ||
|  | 
 | ||
|  | ==============
 | ||
|  |  Introduction
 | ||
|  | ==============
 | ||
|  | 
 | ||
|  | The new iterator categories are intended to correspond to the old
 | ||
|  | iterator categories, as specified in a diagram in N1550_. For example,
 | ||
|  | an iterator categorized as a mutable Forward Iterator under the old
 | ||
|  | scheme is now a Writable, Lvalue, and Foward Traversal iterator.
 | ||
|  | However, there is a problem with this correspondance, the new iterator
 | ||
|  | categories place requirements on the ``iterator_traits<X>::reference``
 | ||
|  | type whereas the standard iterator requirements say nothing about the
 | ||
|  | ``reference`` type . In particular, the new Readable Iterator
 | ||
|  | requirements say that the return type of ``*a`` must be
 | ||
|  | ``iterator_traits<X>::reference`` and the Lvalue Iterator requirements
 | ||
|  | says that ``iterator_traits<X>::reference`` must be ``T&`` or ``const
 | ||
|  | T&``.
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ====================
 | ||
|  |  Proposed Resolution
 | ||
|  | ====================
 | ||
|  | 
 | ||
|  | Change the standard requirements to match the requirements of the new
 | ||
|  | iterators. (more details to come)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ==========
 | ||
|  |  Rationale
 | ||
|  | ==========
 | ||
|  | 
 | ||
|  | The lack of specification in the standard of the ``reference`` type is
 | ||
|  | certainly a defect. Without specification, it is entirely useless in a
 | ||
|  | generic function. The current practice in the community is generally
 | ||
|  | to assume there are requirements on the ``reference`` type, such as
 | ||
|  | those proposed in the new iterator categories.
 | ||
|  | 
 | ||
|  | There is some danger in *adding* requirements to existing concepts.
 | ||
|  | This will mean that some existing iterator types will no longer meet
 | ||
|  | the iterator requirements. However, we feel that the impact of this is
 | ||
|  | small enough to warrant going ahead with this change.
 | ||
|  | 
 | ||
|  | An alternative solution would be to leave the standard requirements as
 | ||
|  | is, and to remove the requirements for the ``reference`` type in the
 | ||
|  | new iterator concepts. We are not in favor of this approach because it
 | ||
|  | extends what we see as a defect further into the future.
 |