@file
Forward declares `boost::hana::type` and related utilities.
-@copyright Louis Dionne 2013-2016
+@copyright Louis Dionne 2013-2017
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
*/
//!
//!
//! @note
- //! For subtle reasons having to do with ADL, the actual representation of
- //! `hana::type` is implementation-defined. In particular, `hana::type`
- //! may be a dependent type, so one should not attempt to do pattern
- //! matching on it. However, one can assume that `hana::type` _inherits_
- //! from `hana::basic_type`, which can be useful when declaring overloaded
- //! functions:
+ //! For subtle reasons, the actual representation of `hana::type` is
+ //! implementation-defined. In particular, `hana::type` may be a dependent
+ //! type, so one should not attempt to do pattern matching on it. However,
+ //! one can assume that `hana::type` _inherits_ from `hana::basic_type`,
+ //! which can be useful when declaring overloaded functions:
//! @code
//! template <typename T>
//! void f(hana::basic_type<T>) {
//! // do something with T
//! }
//! @endcode
+ //! The full story is that [ADL][] causes template arguments to be
+ //! instantiated. Hence, if `hana::type` were defined naively, expressions
+ //! like `hana::type<T>{} == hana::type<U>{}` would cause both `T` and `U`
+ //! to be instantiated. This is usually not a problem, except when `T` or
+ //! `U` should not be instantiated. To avoid these instantiations,
+ //! `hana::type` is implemented using some cleverness, and that is
+ //! why the representation is implementation-defined. When that
+ //! behavior is not required, `hana::basic_type` can be used instead.
//!
//!
//! @anchor type_lvalues_and_rvalues
//! The hash of a type is just that type itself. In other words, `hash`
//! is the identity function on `hana::type`s.
//! @include example/type/hashable.cpp
+ //!
+ //! [ADL]: http://en.cppreference.com/w/cpp/language/adl
#ifdef BOOST_HANA_DOXYGEN_INVOKED
template <typename T>
struct type {