diff --git a/include/boost/iterator/function_output_iterator.hpp b/include/boost/iterator/function_output_iterator.hpp index 2708bbd..72a864d 100644 --- a/include/boost/iterator/function_output_iterator.hpp +++ b/include/boost/iterator/function_output_iterator.hpp @@ -13,6 +13,10 @@ #include #include +#include +#include +#include +#include namespace boost { namespace iterators { @@ -24,20 +28,31 @@ namespace iterators { class output_proxy { public: - explicit output_proxy(UnaryFunction& f) : m_f(f) { } + explicit output_proxy(UnaryFunction& f) BOOST_NOEXCEPT : m_f(f) { } #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES - template output_proxy& operator=(const T& value) { + template + typename boost::disable_if_c< + boost::is_same< typename boost::remove_cv< T >::type, output_proxy >::value, + output_proxy& + >::type operator=(const T& value) { m_f(value); return *this; } #else - template output_proxy& operator=(T&& value) { + template + typename boost::disable_if_c< + boost::is_same< typename boost::remove_cv< typename boost::remove_reference< T >::type >::type, output_proxy >::value, + output_proxy& + >::type operator=(T&& value) { m_f(static_cast< T&& >(value)); return *this; } #endif + BOOST_DEFAULTED_FUNCTION(output_proxy(output_proxy const& that), BOOST_NOEXCEPT : m_f(that.m_f) {}) + BOOST_DELETED_FUNCTION(output_proxy& operator=(output_proxy const&)) + private: UnaryFunction& m_f; };