diff --git a/develop/detail/iterators/iteration_proxy.hpp b/develop/detail/iterators/iteration_proxy.hpp
index 296101c8..08b32caf 100644
--- a/develop/detail/iterators/iteration_proxy.hpp
+++ b/develop/detail/iterators/iteration_proxy.hpp
@@ -79,7 +79,7 @@ template<typename IteratorType> class iteration_proxy
 
   public:
     /// construct iteration proxy from a container
-    explicit iteration_proxy(typename IteratorType::reference cont)
+    explicit iteration_proxy(typename IteratorType::reference cont) noexcept
         : container(cont) {}
 
     /// return iterator begin (needed for range-based for)
diff --git a/develop/detail/iterators/primitive_iterator.hpp b/develop/detail/iterators/primitive_iterator.hpp
index fd2a00cb..db0b1e7c 100644
--- a/develop/detail/iterators/primitive_iterator.hpp
+++ b/develop/detail/iterators/primitive_iterator.hpp
@@ -1,9 +1,7 @@
 #pragma once
 
-#include <ciso646> // not
 #include <cstddef> // ptrdiff_t
 #include <limits>  // numeric_limits
-#include <ostream> // ostream
 
 namespace nlohmann
 {
@@ -20,9 +18,15 @@ end_value (`1`) models past the end.
 */
 class primitive_iterator_t
 {
-  public:
+  private:
     using difference_type = std::ptrdiff_t;
+    static constexpr difference_type begin_value = 0;
+    static constexpr difference_type end_value = begin_value + 1;
 
+    /// iterator as signed integer type
+    difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
+
+  public:
     constexpr difference_type get_value() const noexcept
     {
         return m_it;
@@ -62,10 +66,10 @@ class primitive_iterator_t
         return lhs.m_it < rhs.m_it;
     }
 
-    primitive_iterator_t operator+(difference_type i)
+    primitive_iterator_t operator+(difference_type n) noexcept
     {
         auto result = *this;
-        result += i;
+        result += n;
         return result;
     }
 
@@ -74,55 +78,43 @@ class primitive_iterator_t
         return lhs.m_it - rhs.m_it;
     }
 
-    friend std::ostream& operator<<(std::ostream& os, primitive_iterator_t it)
-    {
-        return os << it.m_it;
-    }
-
-    primitive_iterator_t& operator++()
+    primitive_iterator_t& operator++() noexcept
     {
         ++m_it;
         return *this;
     }
 
-    primitive_iterator_t const operator++(int)
+    primitive_iterator_t const operator++(int) noexcept
     {
         auto result = *this;
         m_it++;
         return result;
     }
 
-    primitive_iterator_t& operator--()
+    primitive_iterator_t& operator--() noexcept
     {
         --m_it;
         return *this;
     }
 
-    primitive_iterator_t const operator--(int)
+    primitive_iterator_t const operator--(int) noexcept
     {
         auto result = *this;
         m_it--;
         return result;
     }
 
-    primitive_iterator_t& operator+=(difference_type n)
+    primitive_iterator_t& operator+=(difference_type n) noexcept
     {
         m_it += n;
         return *this;
     }
 
-    primitive_iterator_t& operator-=(difference_type n)
+    primitive_iterator_t& operator-=(difference_type n) noexcept
     {
         m_it -= n;
         return *this;
     }
-
-  private:
-    static constexpr difference_type begin_value = 0;
-    static constexpr difference_type end_value = begin_value + 1;
-
-    /// iterator as signed integer type
-    difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
 };
 }
 }
diff --git a/develop/detail/macro_scope.hpp b/develop/detail/macro_scope.hpp
index f8936025..8316c077 100644
--- a/develop/detail/macro_scope.hpp
+++ b/develop/detail/macro_scope.hpp
@@ -1,7 +1,5 @@
 #pragma once
 
-#include <ciso646> // not
-
 // This file contains all internal macro definitions
 // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
 
@@ -38,7 +36,7 @@
 #endif
 
 // allow to disable exceptions
-#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && not defined(JSON_NOEXCEPTION)
+#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
     #define JSON_THROW(exception) throw exception
     #define JSON_TRY try
     #define JSON_CATCH(exception) catch(exception)
diff --git a/develop/json.hpp b/develop/json.hpp
index f4c139e4..320900e3 100644
--- a/develop/json.hpp
+++ b/develop/json.hpp
@@ -1301,7 +1301,7 @@ class basic_json
             array = create<array_t>(std::move(value));
         }
 
-        void destroy(value_t t)
+        void destroy(value_t t) noexcept
         {
             switch (t)
             {
@@ -1346,7 +1346,7 @@ class basic_json
     value is changed, because the invariant expresses a relationship between
     @a m_type and @a m_value.
     */
-    void assert_invariant() const
+    void assert_invariant() const noexcept
     {
         assert(m_type != value_t::object or m_value.object != nullptr);
         assert(m_type != value_t::array or m_value.array != nullptr);
@@ -2140,7 +2140,7 @@ class basic_json
 
     @since version 1.0.0
     */
-    ~basic_json()
+    ~basic_json() noexcept
     {
         assert_invariant();
         m_value.destroy(m_type);
@@ -4481,7 +4481,7 @@ class basic_json
     @note The name of this function is not yet final and may change in the
     future.
     */
-    static iteration_proxy<iterator> iterator_wrapper(reference ref)
+    static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept
     {
         return iteration_proxy<iterator>(ref);
     }
@@ -4489,7 +4489,7 @@ class basic_json
     /*!
     @copydoc iterator_wrapper(reference)
     */
-    static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref)
+    static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept
     {
         return iteration_proxy<const_iterator>(ref);
     }
@@ -4531,7 +4531,8 @@ class basic_json
     @endcode
 
     @note When iterating over an array, `key()` will return the index of the
-          element as string (see example).
+          element as string (see example). For primitive types (e.g., numbers),
+          `key()` returns an empty string.
 
     @return iteration proxy object wrapping @a ref with an interface to use in
             range-based for loops
@@ -4542,8 +4543,10 @@ class basic_json
     changes in the JSON value.
 
     @complexity Constant.
+
+    @since version 3.x.x.
     */
-    iteration_proxy<iterator> items()
+    iteration_proxy<iterator> items() noexcept
     {
         return iteration_proxy<iterator>(*this);
     }
@@ -4551,7 +4554,7 @@ class basic_json
     /*!
     @copydoc items()
     */
-    iteration_proxy<const_iterator> items() const
+    iteration_proxy<const_iterator> items() const noexcept
     {
         return iteration_proxy<const_iterator>(*this);
     }