From da00617e5612f8aa54d14d1480aa065396ef02c9 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Mon, 9 Jun 2025 03:37:01 +0300 Subject: [PATCH] Use perfect forwarding in assignment to operator_brackets_proxy. Also apply noexcept markup to all of the proxy operators. --- include/boost/iterator/iterator_facade.hpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) 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; }