diff --git a/include/boost/iterator/iterator_facade.hpp b/include/boost/iterator/iterator_facade.hpp index e449009..0604b3c 100644 --- a/include/boost/iterator/iterator_facade.hpp +++ b/include/boost/iterator/iterator_facade.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -346,21 +347,27 @@ class operator_brackets_proxy // Iterator is actually an iterator_facade, so we do not have to // go through iterator_traits to access the traits. using reference = typename Iterator::reference; - using value_type = typename Iterator::value_type; public: - operator_brackets_proxy(Iterator const& iter) : + explicit operator_brackets_proxy(Iterator const& iter) noexcept(std::is_nothrow_copy_constructible< Iterator >::value) : m_iter(iter) {} - operator reference() const + operator reference() const noexcept(noexcept(*std::declval< Iterator const& >())) { return *m_iter; } - operator_brackets_proxy& operator=(value_type const& val) + template< typename T > + typename std::enable_if< + !std::is_same< + operator_brackets_proxy< Iterator >, + typename std::remove_cv< typename std::remove_reference< T >::type >::type + >::value, + operator_brackets_proxy& + >::type operator= (T&& val) noexcept(std::is_nothrow_assignable< reference, T&& >::value) { - *m_iter = val; + *m_iter = static_cast< T&& >(val); return *this; }