mirror of
				https://github.com/boostorg/utility.git
				synced 2025-11-04 02:11:45 +01:00 
			
		
		
		
	
		
			
	
	
		
			105 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								[/
							 | 
						||
| 
								 | 
							
								 / Copyright (c) 2008 Howard Hinnant
							 | 
						||
| 
								 | 
							
								 / Copyright (c) 2008 Beman Dawes
							 | 
						||
| 
								 | 
							
								 / Copyright (c) 2009-20010 Vicente J. Botet Escriba
							 | 
						||
| 
								 | 
							
								 /
							 | 
						||
| 
								 | 
							
								 / Distributed under 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)
							 | 
						||
| 
								 | 
							
								 /]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[article Declval
							 | 
						||
| 
								 | 
							
								    [quickbook 1.5]
							 | 
						||
| 
								 | 
							
								    [authors [Hinnant, Howard]]
							 | 
						||
| 
								 | 
							
								    [authors [Dawes, Beman]]
							 | 
						||
| 
								 | 
							
								    [authors [Botet Escriba, Vicente J.]]
							 | 
						||
| 
								 | 
							
								    [copyright 2008 Howard Hinnant]
							 | 
						||
| 
								 | 
							
								    [copyright 2008 Beman Dawes]
							 | 
						||
| 
								 | 
							
								    [copyright 2009-2010 Vicente J. Botet Escriba]
							 | 
						||
| 
								 | 
							
								    [license
							 | 
						||
| 
								 | 
							
								        Distributed under 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])
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[/===============]
							 | 
						||
| 
								 | 
							
								[section Overview]
							 | 
						||
| 
								 | 
							
								[/===============]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The motivation for `declval` was introduced in [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2958.html#Value N2958: 
							 | 
						||
| 
								 | 
							
								Moving Swap Forward]. Here follows a rewording of this chapter.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								With the provision of decltype, late-specified return types, and default template-arguments for function templates a 
							 | 
						||
| 
								 | 
							
								new generation of SFINAE patterns will emerge to at least partially compensate the lack of concepts on the C++0x timescale. 
							 | 
						||
| 
								 | 
							
								Using this technique, it is sometimes necessary to obtain an object of a known type in a non-using context, e.g. given the declaration 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class T>
							 | 
						||
| 
								 | 
							
								  T&& declval(); // not used
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								as part of the function template declaration 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class To, class From>
							 | 
						||
| 
								 | 
							
								  decltype(static_cast<To>(declval<From>())) convert(From&&);
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								or as part of a class template definition 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class> class result_of;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class Fn, class... ArgTypes>
							 | 
						||
| 
								 | 
							
								  struct result_of<Fn(ArgTypes...)> 
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    typedef decltype(declval<Fn>()(declval<ArgTypes>()...)) type;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								The role of the function template declval() is a transformation of a type T into a value without using or evaluating this function. 
							 | 
						||
| 
								 | 
							
								The name is supposed to direct the reader's attention to the fact that the expression `declval<T>()` is an lvalue if and only if 
							 | 
						||
| 
								 | 
							
								T is an lvalue-reference, otherwise an rvalue. To extend the domain of this function we can do a bit better by changing its declaration to 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class T>
							 | 
						||
| 
								 | 
							
								  typename std::add_rvalue_reference<T>::type declval(); // not used
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								which ensures that we can also use cv void as template parameter. The careful reader might have noticed that `declval()` 
							 | 
						||
| 
								 | 
							
								already exists under the name create() as part of the definition of the semantics of the type trait is_convertible in the C==0x standard. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The provision of a new library component that allows the production of values in unevaluated expressions is considered as 
							 | 
						||
| 
								 | 
							
								important to realize constrained templates in C++0x where concepts are not available. 
							 | 
						||
| 
								 | 
							
								This extremely light-weight function is expected to be part of the daily tool-box of the C++0x programmer. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[/=================]
							 | 
						||
| 
								 | 
							
								[section:reference Reference ]
							 | 
						||
| 
								 | 
							
								[/=================]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`#include <boost/utility/declval.hpp>`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace boost {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename T>
							 | 
						||
| 
								 | 
							
								        typename add_rvalue_reference<T>::type declval(); //noexcept; // as unevaluated operand
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }  // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The library provides the function template declval to simplify the definition of expressions which occur as unevaluated operands.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template <typename T>
							 | 
						||
| 
								 | 
							
								        typename add_rvalue_reference<T>::type declval();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[*Remarks:] If this function is used, the program is ill-formed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[*Remarks:] The template parameter T of declval may be an incomplete type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[*Example:]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <class To, class From>
							 | 
						||
| 
								 | 
							
								    decltype(static_cast<To>(declval<From>())) convert(From&&);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Declares a function template convert which only participats in overloading if the type From can be explicitly converted to type To. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |