[/ 
  Copyright 2007 John Maddock.
  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:is_convertible is_convertible]
   template <class From, class To>
   struct is_convertible : public __tof {};
  
__inherit If an imaginary lvalue of type `From` is convertible to type `To` then 
inherits from __true_type, otherwise inherits from __false_type.

Type From must not be an incomplete type.

Type To must not be an incomplete, or function type.

No types are considered to be convertible to array types or abstract-class types.

This template can not detect whether a converting-constructor is `public` or not: if
type `To` has a `private` converting constructor from type `From` then instantiating
`is_convertible<From, To>` will produce a compiler error.  For this reason `is_convertible`
can not be used to determine whether a type has a `public` copy-constructor or not.

This template will also produce compiler errors if the conversion is ambiguous, 
for example:

   struct A {};
   struct B : A {};
   struct C : A {};
   struct D : B, C {};
   // This produces a compiler error, the conversion is ambiguous:
   bool const y = boost::is_convertible<D*,A*>::value;

__std_ref 4 and 8.5.

__compat This template is currently broken with Borland C++ Builder 5 (and earlier), 
for constructor-based conversions, and for the Metrowerks 7 (and earlier) 
compiler in all cases.  If the compiler does not support `__is_abstract`, then the
template parameter `To` must not be an abstract type.

__header ` #include <boost/type_traits/is_convertible.hpp>` or ` #include <boost/type_traits.hpp>`

__examples

[:`is_convertible<int, double>` inherits from `__true_type`.]

[:`is_convertible<const int, double>::type` is the type `__true_type`.]

[:`is_convertible<int* const, int*>::value` is an integral constant 
expression that evaluates to /true/.]

[:`is_convertible<int const*, int*>::value` is an integral constant 
expression that evaluates to /false/: the conversion would require a `const_cast`.]

[:`is_convertible<int const&, long>::value` is an integral constant 
expression that evaluates to /true/.]

[:`is_convertible<int, int>::value` is an integral constant 
expression that evaluates to /false/.]

[:`is_convertible<T, T>::value_type` is the type `bool`.]

[endsect]


