.. _parallel_for_each_semantics: parallel_for_each Body semantics and requirements ================================================= .. contents:: :local: :depth: 1 Description *********** This page clarifies `ParallelForEachBody `_ named requirements for ``tbb::parallel_for_each`` algorithm specification. .. code:: cpp namespace oneapi { namespace tbb { template void parallel_for_each( InputIterator first, InputIterator last, Body body ); // overload (1) template void parallel_for_each( InputIterator first, InputIterator last, Body body, task_group_context& group ); // overload (2) template void parallel_for_each( Container& c, Body body ); // overload (3) template void parallel_for_each( Container& c, Body body, task_group_context& group ); // overload (4) template void parallel_for_each( const Container& c, Body body ); // overload (5) template void parallel_for_each( const Container& c, Body body, task_group_context& group ); // overload (6) } // namespace tbb } // namespace oneapi Terms ----- * ``iterator`` determines the type of the iterator passed into ``parallel_for_each`` algorithm (which is ``InputIterator`` for overloads `(1)` and `(2)` and ``decltype(std::begin(c))`` for overloads `(3) - (6)`) * ``value_type`` - the type ``typename std::iterator_traits::value_type`` * ``reference`` - the type ``typename std::iterator_traits::reference``. Requirements for different iterator types ----------------------------------------- If the ``iterator`` satisfies `Input iterator` named requirements from [input.iterators] ISO C++ Standard section and do not satisfies `Forward iterator` named requirements from [forward.iterators] ISO C++ Standard section, ``tbb::parallel_for_each`` requires the execution of the ``body`` with an object of type ``const value_type&`` or ``value_type&&`` to be well-formed. If both forms are well-formed, an overload with rvalue reference will be preferred. .. caution:: If the ``Body`` only takes non-const lvalue reference to ``value_type``, named requirements above are violated and the program can be ill-formed. If the ``iterator`` satisfies `Forward iterator` named requirements from [forward.iterators] ISO C++ Standard section, ``tbb::parallel_for_each`` requires the execution of the ``body`` with an object of type ``reference`` to be well-formed. Requirements for ``Body`` with ``feeder`` argument -------------------------------------------------- Additional elements submitted into ``tbb::parallel_for_each`` through the ``feeder::add`` passes to the ``Body`` as rvalues and therefore the corresponding execution of the ``Body`` is required to be well-formed.