std::begin
и std::end
- это функции, которые принимают контейнер и дают вам итераторы, указывающие на первый и один за другим элементы соответственно.
std::begin
и std::end
сами по себе не являются итераторами, и они не работают с необработанными указателями, поскольку указатели не имеют никакой информации о размере. При вызове std::begin(a+2)
, a
распадается на указатель на свой первый элемент и сдвигается на 2 элемента. Полученный указатель передается в std::begin
, но std::begin
не работает с указателями, поэтому результатом является ошибка компиляции.
Чтобы решить вашу проблему, просто избавьтесь от звонков на std::begin
и std::end
:
std::reverse(a+2, a+4);
Это работает, поскольку указатели удовлетворяют всем требованиям для итератора, поэтому указатели, следующие из a+2
и a+4
, полностью действительны для передачи в std::reverse
.