diff --git a/doc/macro_reference.qbk b/doc/macro_reference.qbk index d334d7f0..48da112b 100644 --- a/doc/macro_reference.qbk +++ b/doc/macro_reference.qbk @@ -751,6 +751,61 @@ with: BOOST_STATIC_CONSTEXPR UIntType xor_mask = a; `` ]] +[[`BOOST_DEFAULTED_FUNCTION(fun, body)`][ +This macro is intended to be used within a class definition in order to declare a default implementation of function `fun`. +For the compilers that do not support C++11 defaulted functions the macro will expand into an inline function definition +with the `body` implementation. For example: +`` + struct my_struct + { + BOOST_DEFAULTED_FUNCTION(my_struct(), {}) + }; +`` +is equivalent to: +`` + struct my_struct + { + my_struct() = default; + }; +`` +or: +`` + struct my_struct + { + my_struct() {} + }; +`` +]] +[[`BOOST_DELETED_FUNCTION(fun)`][ +This macro is intended to be used within a class definition in order to declare a deleted function `fun`. +For the compilers that do not support C++11 deleted functions the macro will expand into a private function +declaration with no definition. Since the macro may change the access mode, it is recommended to use this macro +at the end of the class definition. For example: +`` + struct noncopyable + { + BOOST_DELETED_FUNCTION(noncopyable(noncopyable const&)) + BOOST_DELETED_FUNCTION(noncopyable& operator= (noncopyable const&)) + }; +`` +is equivalent to: +`` + struct noncopyable + { + noncopyable(noncopyable const&) = delete; + noncopyable& operator= (noncopyable const&) = delete; + }; +`` +or: +`` + struct noncopyable + { + private: + noncopyable(noncopyable const&); + noncopyable& operator= (noncopyable const&); + }; +`` +]] [[ `` BOOST_NOEXCEPT diff --git a/include/boost/config/compiler/gcc.hpp b/include/boost/config/compiler/gcc.hpp index 4ce54d7c..d2ea38e8 100644 --- a/include/boost/config/compiler/gcc.hpp +++ b/include/boost/config/compiler/gcc.hpp @@ -217,6 +217,11 @@ # define BOOST_NO_SFINAE_EXPR #endif +// GCC 4.5 forbids declaration of defaulted functions in private or protected sections +#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && (__GNUC__ == 4 && __GNUC_MINOR__ <= 5) +# define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS +#endif + // C++0x features in 4.5.0 and later // #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__) diff --git a/include/boost/config/suffix.hpp b/include/boost/config/suffix.hpp index 5e60eb22..1d9cec61 100644 --- a/include/boost/config/suffix.hpp +++ b/include/boost/config/suffix.hpp @@ -689,6 +689,36 @@ namespace std{ using ::type_info; } # define BOOST_ALIGNMENT(x) #endif +// Defaulted and deleted function declaration helpers +// These macros are intended to be inside a class definition. +// BOOST_DEFAULTED_FUNCTION accepts the function declaration and its +// body, which will be used if the compiler doesn't support defaulted functions. +// BOOST_DELETED_FUNCTION only accepts the function declaration. It +// will expand to a private function declaration, if the compiler doesn't support +// deleted functions. Because of this it is recommended to use BOOST_DELETED_FUNCTION +// in the end of the class definition. +// +// class my_class +// { +// public: +// // Default-constructible +// BOOST_DEFAULTED_FUNCTION(my_class(), {}) +// // Copying prohibited +// BOOST_DELETED_FUNCTION(my_class(my_class const&)) +// BOOST_DELETED_FUNCTION(my_class& operator= (my_class const&)) +// }; +// +#if !(defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)) +# define BOOST_DEFAULTED_FUNCTION(fun, body) fun = default; +#else +# define BOOST_DEFAULTED_FUNCTION(fun, body) fun body +#endif + +#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) +# define BOOST_DELETED_FUNCTION(fun) fun = delete; +#else +# define BOOST_DELETED_FUNCTION(fun) private: fun; +#endif // // Set BOOST_NO_DECLTYPE_N3276 when BOOST_NO_DECLTYPE is defined