123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- [/
- 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).
- ]
- [library Boost.TypeTraits
- [quickbook 1.5]
- [copyright 2000 2011 Adobe Systems Inc, David Abrahams, Frederic Bron,
- Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones,
- Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen,
- Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven Watanabe]
- [purpose Meta-programming support library]
- [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])
- ]
- [authors [authors, various]]
- [category template]
- [category generic]
- [last-revision $Date$]
- ]
- [include ../../../tools/auto_index/include/auto_index_helpers.qbk]
- [def __boost_root ../../../../]
- [def __tof '''<replaceable><link linkend="boost_typetraits.reference.integral_constant">true_type</link>-or-<link linkend="boost_typetraits.reference.integral_constant">false_type</link></replaceable>''']
- [def __below '''<replaceable>see-below</replaceable>''']
- [def __true_type [link boost_typetraits.reference.integral_constant true_type]]
- [def __false_type [link boost_typetraits.reference.integral_constant false_type]]
- [def __integral_constant [link boost_typetraits.reference.integral_constant integral_constant]]
- [def __alias [*Aliases:]]
- [def __inherit [*Inherits:]]
- [def __std_paper [*C++ Standard Paper:]]
- [def __std_ref [*C++ Standard Reference:]]
- [def __header [*Header:]]
- [def __compat [*Compiler Compatibility:]]
- [def __examples [*Examples:]]
- [def __type [*type:]]
- [def __transform_workaround [link boost_typetraits.category.transform.broken_compiler_workarounds_ compiler workarounds]]
- [def __intrinsics [link boost_typetraits.intrinsics intrinsics]]
- [def __is_void [link boost_typetraits.reference.is_void is_void]]
- [def __is_integral [link boost_typetraits.reference.is_integral is_integral]]
- [def __is_floating_point [link boost_typetraits.reference.is_floating_point is_floating_point]]
- [def __is_pointer [link boost_typetraits.reference.is_pointer is_pointer]]
- [def __is_reference [link boost_typetraits.reference.is_reference is_reference]]
- [def __is_lvalue_reference [link boost_typetraits.reference.is_lvalue_reference is_lvalue_reference]]
- [def __is_rvalue_reference [link boost_typetraits.reference.is_rvalue_reference is_rvalue_reference]]
- [def __is_member_pointer [link boost_typetraits.reference.is_member_pointer is_member_pointer]]
- [def __is_array [link boost_typetraits.reference.is_array is_array]]
- [def __is_bounded_array [link boost_typetraits.reference.is_bounded_array is_bounded_array]]
- [def __is_unbounded_array [link boost_typetraits.reference.is_unbounded_array is_unbounded_array]]
- [def __is_union [link boost_typetraits.reference.is_union is_union]]
- [def __is_class [link boost_typetraits.reference.is_class is_class]]
- [def __is_enum [link boost_typetraits.reference.is_enum is_enum]]
- [def __is_enum [link boost_typetraits.reference.is_enum is_enum]]
- [def __is_function [link boost_typetraits.reference.is_function is_function]]
- [def __is_arithmetic [link boost_typetraits.reference.is_arithmetic is_arithmetic]]
- [def __is_fundamental [link boost_typetraits.reference.is_fundamental is_fundamental]]
- [def __is_object [link boost_typetraits.reference.is_object is_object]]
- [def __is_scalar [link boost_typetraits.reference.is_scalar is_scalar]]
- [def __is_compound [link boost_typetraits.reference.is_compound is_compound]]
- [def __is_member_function_pointer [link boost_typetraits.reference.is_member_function_pointer is_member_function_pointer]]
- [def __is_member_object_pointer [link boost_typetraits.reference.is_member_object_pointer is_member_object_pointer]]
- [def __alignment_of [link boost_typetraits.reference.alignment_of alignment_of]]
- [def __rank [link boost_typetraits.reference.rank rank]]
- [def __extent [link boost_typetraits.reference.extent extent]]
- [def __is_empty [link boost_typetraits.reference.is_empty is_empty]]
- [def __is_const [link boost_typetraits.reference.is_const is_const]]
- [def __is_assignable [link boost_typetraits.reference.is_assignable is_assignable]]
- [def __is_copy_constructible [link boost_typetraits.reference.is_copy_constructible is_copy_constructible]]
- [def __is_copy_assignable [link boost_typetraits.reference.is_copy_assignable is_copy_assignable]]
- [def __is_constructible [link boost_typetraits.reference.is_constructible is_constructible]]
- [def __is_list_constructible [link boost_typetraits.reference.is_list_constructible is_list_constructible]]
- [def __is_default_constructible [link boost_typetraits.reference.is_default_constructible is_default_constructible]]
- [def __is_destructible [link boost_typetraits.reference.is_destructible is_destructible]]
- [def __is_volatile [link boost_typetraits.reference.is_volatile is_volatile]]
- [def __is_abstract [link boost_typetraits.reference.is_abstract is_abstract]]
- [def __is_polymorphic [link boost_typetraits.reference.is_polymorphic is_polymorphic]]
- [def __is_signed [link boost_typetraits.reference.is_signed is_signed]]
- [def __is_unsigned [link boost_typetraits.reference.is_unsigned is_unsigned]]
- [def __has_virtual_destructor [link boost_typetraits.reference.has_virtual_destructor has_virtual_destructor]]
- [def __is_pod [link boost_typetraits.reference.is_pod is_pod]]
- [def __is_final [link boost_typetraits.reference.is_final is_final]]
- [def __has_trivial_constructor [link boost_typetraits.reference.has_trivial_constructor has_trivial_constructor]]
- [def __has_new_operator [link boost_typetraits.reference.has_new_operator has_new_operator]]
- [def __has_trivial_copy [link boost_typetraits.reference.has_trivial_copy has_trivial_copy]]
- [def __has_trivial_default_constructor [link boost_typetraits.reference.has_trivial_constructor has_trivial_default_constructor]]
- [def __has_trivial_copy_constructor [link boost_typetraits.reference.has_trivial_copy has_trivial_copy_constructor]]
- [def __has_trivial_move_constructor [link boost_typetraits.reference.has_trivial_move_constructor has_trivial_move_constructor]]
- [def __has_trivial_assign [link boost_typetraits.reference.has_trivial_assign has_trivial_assign]]
- [def __has_trivial_move_assign [link boost_typetraits.reference.has_trivial_move_assign has_trivial_move_assign]]
- [def __has_trivial_destructor [link boost_typetraits.reference.has_trivial_destructor has_trivial_destructor]]
- [def __is_stateless [link boost_typetraits.reference.is_stateless is_stateless]]
- [def __has_nothrow_constructor [link boost_typetraits.reference.has_nothrow_constructor has_nothrow_constructor]]
- [def __has_nothrow_copy [link boost_typetraits.reference.has_nothrow_copy has_nothrow_copy]]
- [def __has_nothrow_default_constructor [link boost_typetraits.reference.has_nothrow_constructor has_nothrow_default_constructor]]
- [def __has_nothrow_copy_constructor [link boost_typetraits.reference.has_nothrow_copy has_nothrow_copy_constructor]]
- [def __has_nothrow_destructor [link boost_typetraits.reference.has_nothrow_destruct has_nothrow_destructor]]
- [def __is_nothrow_move_constructible [link boost_typetraits.reference.is_nothrow_move_constructible is_nothrow_move_constructible]]
- [def __has_nothrow_assign [link boost_typetraits.reference.has_nothrow_assign has_nothrow_assign]]
- [def __is_nothrow_move_assignable [link boost_typetraits.reference.is_nothrow_move_assignable is_nothrow_move_assignable]]
- [def __is_nothrow_swappable [link boost_typetraits.reference.is_nothrow_swappable is_nothrow_swappable]]
- [def __is_base_of [link boost_typetraits.reference.is_base_of is_base_of]]
- [def __is_virtual_base_of [link boost_typetraits.reference.is_virtual_base_of is_virtual_base_of]]
- [def __is_convertible [link boost_typetraits.reference.is_convertible is_convertible]]
- [def __is_same [link boost_typetraits.reference.is_same is_same]]
- [def __remove_const [link boost_typetraits.reference.remove_const remove_const]]
- [def __remove_volatile [link boost_typetraits.reference.remove_volatile remove_volatile]]
- [def __remove_cv [link boost_typetraits.reference.remove_cv remove_cv]]
- [def __remove_cv_ref [link boost_typetraits.reference.remove_cv_ref remove_cv_ref]]
- [def __remove_reference [link boost_typetraits.reference.remove_reference remove_reference]]
- [def __remove_extent [link boost_typetraits.reference.remove_extent remove_extent]]
- [def __remove_all_extents [link boost_typetraits.reference.remove_all_extents remove_all_extents]]
- [def __remove_pointer [link boost_typetraits.reference.remove_pointer remove_pointer]]
- [def __add_reference [link boost_typetraits.reference.add_reference add_reference]]
- [def __add_lvalue_reference [link boost_typetraits.reference.add_lvalue_reference add_lvalue_reference]]
- [def __add_rvalue_reference [link boost_typetraits.reference.add_rvalue_reference add_rvalue_reference]]
- [def __add_pointer [link boost_typetraits.reference.add_pointer add_pointer]]
- [def __add_const [link boost_typetraits.reference.add_const add_const]]
- [def __add_volatile [link boost_typetraits.reference.add_volatile add_volatile]]
- [def __add_cv [link boost_typetraits.reference.add_cv add_cv]]
- [def __common_type [link boost_typetraits.reference.common_type common_type]]
- [def __conditional [link boost_typetraits.reference.conditional conditional]]
- [def __type_with_alignment [link boost_typetraits.reference.type_with_alignment type_with_alignment]]
- [def __aligned_storage [link boost_typetraits.reference.aligned_storage aligned_storage]]
- [def __function_traits [link boost_typetraits.reference.function_traits function_traits]]
- [def __promote [link boost_typetraits.reference.promote promote]]
- [def __integral_promotion [link boost_typetraits.reference.integral_promotion integral_promotion]]
- [def __floating_point_promotion [link boost_typetraits.reference.floating_point_promotion floating_point_promotion]]
- [def __make_signed [link boost_typetraits.reference.make_signed make_signed]]
- [def __make_unsigned [link boost_typetraits.reference.make_unsigned make_unsigned]]
- [def __make_void [link boost_typetraits.reference.make_void make_void]]
- [def __decay [link boost_typetraits.reference.decay decay]]
- [def __is_complex [link boost_typetraits.reference.is_complex is_complex]]
- [def __copy_cv [link boost_typetraits.reference.copy_cv copy_cv]]
- [def __copy_cv_ref [link boost_typetraits.reference.copy_cv_ref copy_cv_ref]]
- [def __copy_reference [link boost_typetraits.reference.copy_reference copy_reference]]
- [def __type_identity [link boost_typetraits.reference.type_identity type_identity]]
- [def __declval [link boost_typetraits.reference.declval declval]]
- [def __detected [link boost_typetraits.reference.detected detected]]
- [def __detected_or [link boost_typetraits.reference.detected_or detected_or]]
- [def __is_detected [link boost_typetraits.reference.is_detected is_detected]]
- [def __is_detected_convertible [link boost_typetraits.reference.is_detected_convertible is_detected_convertible]]
- [def __is_detected_exact [link boost_typetraits.reference.is_detected_exact is_detected_exact]]
- [def __nonesuch [link boost_typetraits.reference.nonesuch nonesuch]]
- [def __is_complete [link boost_typetraits.reference.is_complete is_complete]]
- [def __compat [*Compiler Compatibility:]]
- [template all_compilers[] __compat All current compilers are supported by this trait.]
- [template has_binary_operator_compat[] __compat Requires working SFINAE (i.e. BOOST_NO_SFINAE is not set). Only a minority of rather old compilers do not support this.]
- [template binary_operator_known_issues[Name Op Ret1 Ret2 Const]
- [*Known issues:]
- For modern compilers (those that support arbitrary SFINAE-expressions and decltype/declval) this trait offers near perfect detection.
- In this situation the macro `BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION` will be defined after including
- [^<boost/type_traits/[Name].hpp>]. Please note however, that detection is based on function signature only,
- in the case that the operator is a function template then [Name] cannot perform
- introspection of the template function body to ensure that the type meets all of the conceptual requirements of the actual code.
- Example:
- #include <boost/type_traits/``[Name]``.hpp>
- #include <iostream>
-
- template <class T>
- struct contains
- {
- T data;
- contains(const T& d) : data(d) {}
- };
- template <class T>
- ``[Ret2]`` operator ``[Op]`` (``[Const]``contains<T> &lhs, const contains<T> &rhs) {
- return f(lhs.data, rhs.data);
- }
- class bad { };
- class good { };
- good f(const good&, const good&) { return /*something*/; }
- int main() {
- std::cout<<std::boolalpha;
- // works fine for contains<good>
- std::cout<<boost::``[Name]``< contains< good > >::value<<'\n'; // true
- contains<good> g;
- g&g; // ok
- // does not work for contains<bad>
- std::cout<<boost::``[Name]``< contains< bad > >::value<<'\n'; // true, should be false
- contains<bad> b;
- b&b; // compile time error
- return 0;
- }
- For older compilers (`BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION` not defined) then there are a number of issues:
- * This trait cannot detect whether binary `operator`[Op] is public or not:
- if `operator`[Op] is defined as a private member of `Lhs` then
- instantiating [^[Name]<Lhs>] will produce a compiler error.
- For this reason [^[Name]] cannot be used to determine whether a type has a public `operator`[Op] or not.
- struct A { private: ``[Ret1]`` operator ``[Op]`` (const A&); };
- boost::``[Name]``<A>::value; // error: A::operator ``[Op]`` (const A&) is private
- * There is an issue if the operator exists only for type `A` and `B` is
- convertible to `A`. In this case, the compiler will report an ambiguous overload.
- struct A { };
- ``[Ret1]`` operator ``[Op]`` (``[Const]``A&, const A&);
- struct B { operator A(); };
- boost::``[Name]``<A>::value; // this is fine
- boost::``[Name]``<B>::value; // error: ambiguous overload
- * `volatile` qualifier is not properly handled and would lead to undefined behavior
- ]
- [template prefix_operator_known_issues[Name Op]
- [*Known issues:]
- For modern compilers (those that support arbitrary SFINAE-expressions and decltype/declval) this trait offers near perfect detection.
- In this situation the macro `BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION` will be defined after including
- [^<boost/type_traits/[Name].hpp>]. Please note however, that detection is based on function signature only,
- in the case that the operator is a function template then [Name] cannot perform
- introspection of the template function body to ensure that the type meets all of the conceptual requirements of the actual code.
- For older compilers (`BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION` not defined) then there are a number of issues:
- * This trait cannot detect whether unary `operator`[Op] is public or not:
- if `operator`[Op] is defined as a private class member of type T then
- instantiating [^[Name]<T>] will produce a compiler error.
- For this reason [^[Name]] cannot be used to determine whether a type has a public `operator`[Op] or not.
- * `volatile` qualifier is not properly handled and would lead to undefined behavior
- * Capturless lambdas are not supported and will lead to a compiler error if [Name] is instantiated
- on the lambda type.
- * Scoped enum types are not supported and will lead to a compiler error if [Name] is instantiated on such a type.
- ]
- A printer-friendly [@http://sourceforge.net/projects/boost/files/boost-docs/
- PDF version of this manual is also available].
- [section:intro Introduction]
- The Boost type-traits library contains a
- set of very specific traits classes, each of which encapsulate a single trait
- from the C++ type system; for example, is a type a pointer or a reference type?
- Or does a type have a trivial constructor, or a const-qualifier?
-
- The type-traits classes share a unified design: each class inherits from
- the type __true_type if the type has the specified property and inherits from
- __false_type otherwise.
- The type-traits library also contains a set of classes that perform a
- specific transformation on a type; for example, they can remove a
- top-level const or volatile qualifier from a type. Each class that
- performs a transformation defines a single typedef-member `type`
- that is the result of the transformation.
- [endsect]
- [include background.qbk]
- [section:category Type Traits by Category]
- [include value_traits.qbk]
- [include transform_traits.qbk]
- [include alignment_traits.qbk]
- [include decomposing_func.qbk]
- [endsect]
- [include user_defined.qbk]
- [include intrinsics.qbk]
- [include mpl.qbk]
- [include examples.qbk]
- [section:reference Alphabetical Reference]
- [include add_const.qbk]
- [include add_cv.qbk]
- [include add_lvalue_reference.qbk]
- [include add_pointer.qbk]
- [include add_reference.qbk]
- [include add_rvalue_reference.qbk]
- [include add_volatile.qbk]
- [include aligned_storage.qbk]
- [include alignment_of.qbk]
- [include conditional.qbk]
- [include common_type.qbk]
- [include copy_cv.qbk]
- [include copy_cv_ref.qbk]
- [include copy_reference.qbk]
- [include decay.qbk]
- [include declval.qbk]
- [include detected.qbk]
- [include detected_or.qbk]
- [include enable_if.qbk]
- [include extent.qbk]
- [include floating_point_promotion.qbk]
- [include function_traits.qbk]
- [include has_bit_and.qbk]
- [include has_bit_and_assign.qbk]
- [include has_bit_or.qbk]
- [include has_bit_or_assign.qbk]
- [include has_bit_xor.qbk]
- [include has_bit_xor_assign.qbk]
- [include has_complement.qbk]
- [include has_dereference.qbk]
- [include has_divides.qbk]
- [include has_divides_assign.qbk]
- [include has_equal_to.qbk]
- [include has_greater.qbk]
- [include has_greater_equal.qbk]
- [include has_left_shift.qbk]
- [include has_left_shift_assign.qbk]
- [include has_less.qbk]
- [include has_less_equal.qbk]
- [include has_logical_and.qbk]
- [include has_logical_not.qbk]
- [include has_logical_or.qbk]
- [include has_minus.qbk]
- [include has_minus_assign.qbk]
- [include has_modulus.qbk]
- [include has_modulus_assign.qbk]
- [include has_multiplies.qbk]
- [include has_multiplies_assign.qbk]
- [include has_negate.qbk]
- [include has_new_operator.qbk]
- [include has_not_equal_to.qbk]
- [include has_nothrow_assign.qbk]
- [include has_nothrow_constructor.qbk]
- [include has_nothrow_copy.qbk]
- [include has_nothrow_destruct.qbk]
- [section:has_nothrow_cp_cons has_nothrow_copy_constructor]
- See __has_nothrow_copy.
- [endsect]
- [section:has_no_throw_def_cons has_nothrow_default_constructor]
- See __has_nothrow_constructor.
- [endsect]
- [include has_plus.qbk]
- [include has_plus_assign.qbk]
- [include has_post_decrement.qbk]
- [include has_post_increment.qbk]
- [include has_pre_decrement.qbk]
- [include has_pre_increment.qbk]
- [include has_right_shift.qbk]
- [include has_right_shift_assign.qbk]
- [include has_trivial_assign.qbk]
- [include has_trivial_constructor.qbk]
- [include has_trivial_copy.qbk]
- [section:has_trivial_cp_cons has_trivial_copy_constructor]
- See __has_trivial_copy.
- [endsect]
- [section:has_trivial_def_cons has_trivial_default_constructor]
- See __has_trivial_constructor.
- [endsect]
- [include has_trivial_destructor.qbk]
- [include has_trivial_move_assign.qbk]
- [include has_trivial_move_constructor.qbk]
- [include has_unary_minus.qbk]
- [include has_unary_plus.qbk]
- [include has_virtual_destructor.qbk]
- [include integral_constant.qbk]
- [include integral_promotion.qbk]
- [include is_abstract.qbk]
- [include is_arithmetic.qbk]
- [include is_array.qbk]
- [include is_assignable.qbk]
- [include is_base_of.qbk]
- [include is_bounded_array.qbk]
- [include is_class.qbk]
- [include is_complete.qbk]
- [include is_complex.qbk]
- [include is_compound.qbk]
- [include is_const.qbk]
- [include is_constructible.qbk]
- [include is_convertible.qbk]
- [include is_copy_assignable.qbk]
- [include is_copy_constructible.qbk]
- [include is_default_constructible.qbk]
- [include is_destructible.qbk]
- [include is_detected.qbk]
- [include is_detected_convertible.qbk]
- [include is_detected_exact.qbk]
- [include is_empty.qbk]
- [include is_enum.qbk]
- [include is_final.qbk]
- [include is_floating_point.qbk]
- [include is_function.qbk]
- [include is_fundamental.qbk]
- [include is_integral.qbk]
- [include is_list_constructible.qbk]
- [include is_lvalue_reference.qbk]
- [include is_member_function_pointer.qbk]
- [include is_member_object_pointer.qbk]
- [include is_member_pointer.qbk]
- [include is_nothrow_move_assignable.qbk]
- [include is_nothrow_move_constructible.qbk]
- [include is_nothrow_swappable.qbk]
- [include is_object.qbk]
- [include is_pod.qbk]
- [include is_pointer.qbk]
- [include is_polymorphic.qbk]
- [include is_reference.qbk]
- [include is_rvalue_reference.qbk]
- [include is_same.qbk]
- [include is_scalar.qbk]
- [include is_signed.qbk]
- [include is_stateless.qbk]
- [include is_unbounded_array.qbk]
- [include is_union.qbk]
- [include is_unsigned.qbk]
- [include is_virtual_base_of.qbk]
- [include is_void.qbk]
- [include is_volatile.qbk]
- [include make_signed.qbk]
- [include make_unsigned.qbk]
- [include make_void.qbk]
- [include nonesuch.qbk]
- [include promote.qbk]
- [include rank.qbk]
- [include remove_all_extents.qbk]
- [include remove_const.qbk]
- [include remove_cv.qbk]
- [include remove_cv_ref.qbk]
- [include remove_extent.qbk]
- [include remove_pointer.qbk]
- [include remove_reference.qbk]
- [include remove_volatile.qbk]
- [include type_identity.qbk]
- [include type_with_alignment.qbk]
- [endsect]
- [include history.qbk]
- [include credits.qbk]
- [named_index class_name Class Index]
- [named_index typedef_name Typedef Index]
- [named_index macro_name Macro Index]
- [index]
|