#Small nitpicks

 - The for loop can be started from 1, as the iteration with 0 doesn't actually do anything.
 - Prefer to reduce the scope of variables if possible. This allows better reasoning for the compiler/optimizer, and makes the code more readable because the variable declaration is nearer to the actual usage.
 - The check `arr[index_sorted] >= 0` in the while loop should probably be `index_sorted >= 0u` (after all, `Element` might not be comparable to integers), but this is `true` in all cases (`-1` for an unsigned integer type is equal to that type's maximum value). However, even checking this becomes unnecessary if the first iteration starts at 1.

<br/>

    template<typename Element>
    void insertion_sort(Element arr[], size_t size) {
        for (auto index = 1u; index < size; ++index) {
            auto temp = arr[index];
            auto index_sorted = index - 1;
            while (arr[index_sorted] > temp) {
                arr[index_sorted + 1] = arr[index_sorted--];
            }
            arr[index_sorted + 1] = temp;
        }
    }