Counting inversions with merge sort
Looks nice and clean.

One thing to note:

With Iterators Const Iterator is not the same as Iterator_Const. The first means you will not change the iterator while the second means you will not change what the iterator points at. You actually want to mean the second the first one is rarely useful.

&lt;ReturnType&gt; SortAndCountInversionsSubroutine(
                 const It begin, const It middle, const It end,
            //   ^^^^^           ^^^^^             ^^^^
                 unsigned int&amp; count)


That's not a very useful const.
Just use:

template&lt;typename It&gt;
// When C++ concepts get added just uncomment the line below.
// requires std::is_const&lt;typename std::iterator_traits&lt;It&gt;::reference_type&gt;::value
&lt;ReturnType&gt; SortAndCountInversionsSubroutine(
                 It begin, It middle, It end,
                 unsigned int&amp; count)


I "might" change this:

auto v = SortAndCountInversionsSubroutine(begin, mid, end, count);
std::move(v.cbegin(), v.cend(), begin);


I might move the std::move() into the SortAndCountInversionsSubroutine() the trouble with that is you need to change the iterators from being iterator_const (once you have fixed the first point) to non const. The advantage of course is that you don't have to return a vectorfrom a function.