Зачем использовать в C ++ 11 функции начала и конца, не являющиеся членами?

Каждый стандартный контейнер имеет begin и end метод возврата итераторов для этого контейнера.Однако C ++ 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);

В своем выступлении Написание современного C ++ , Херб Саттер говорит, что вы всегда должны использовать бесплатные функции сейчас, когда вам нужен начальный или конечный итератор для контейнер. Однако он не вдавался в подробности относительно того, почему вам это может понадобиться. Глядя на код, он избавляет вас от одного символа. Итак, что касается стандартных контейнеров, бесплатные функции кажутся совершенно бесполезными. Херб Саттер указал на преимущества нестандартных контейнеров, но, опять же, не стал вдаваться в подробности.

Итак, вопрос в том, что именно делают версии бесплатных функций std :: begin и std :: end , помимо вызова соответствующих версий функций-членов, и зачем вам хотите их использовать?

185
задан Jonas 20 November 2019 в 12:27
поделиться