Каждый стандартный контейнер имеет метод begin
и end
для возврата итераторов для этого контейнера. Однако С++ 11, по-видимому, ввел бесплатные функции, называемые std::begin
и std::end
, которые вызывают функции-члены begin
и end
. Итак, вместо написания
auto i = v.begin();
auto e = v.end();
вы пишете
using std::begin;
using std::end;
auto i = begin(v);
auto e = end(v);
В своем выступлении Написание Modern С++, Herb Sutter говорит, что вы всегда должны использовать бесплатные функции сейчас, когда вы хотите, чтобы начальный или конечный итератор для контейнера. Тем не менее, он не задумывается о том, почему вы хотите. Глядя на код, он сохраняет вас всем одним персонажем. Итак, что касается стандартных контейнеров, бесплатные функции кажутся совершенно бесполезными. Трава Саттер указала, что есть преимущества для нестандартных контейнеров, но опять же он не вдавался в подробности.
Итак, вопрос в том, что именно делают версии бесплатных функций std::begin
и std::end
за пределами вызова их соответствующих версий функций-членов и почему вы хотите их использовать?