Loop over whole array starting from any index
There is no reason to initialize i as {c + std::distance(begin, start)}. Upon such initialization you are guaranteed that i == start. A much simpler i{start} suffices.
Testing for i == size, or i == end inside the loop, as well as tracking two iterators, feels wasteful. Consider splitting the loop into two, e.g:

    for (i = start; i != end; ++i) {
        fn(i);
    }

    for (i = begin; i != start; ++i) {
        fn(i);
    }

I am not sure that for_start is a good name. I am also not sure what name would be good. iterate_rotated perhaps?