При создании пользовательского класса контейнера, который воспроизводится по обычным правилам (т.е. работает с алгоритмами STL, работает с хорошо выполненным общим кодом и т.д.), в С++ 03 было достаточно реализовать поддержку итератора и начать/конечных функций.
В С++ 11 представлены два новых понятия - диапазон для циклов и std:: begin/end. Диапазон, основанный на цикле, понимает функции начала/конца элемента, поэтому любые контейнеры С++ 03 поддерживают диапазон из-за коробки. Для алгоритмов рекомендуемый способ (согласно "Написание современного кода на С++" от Herb Sutter) заключается в использовании std:: begin вместо функции-члена.
Однако на данном этапе я должен спросить - это рекомендуемый способ вызвать полноценную функцию begin() (т.е. std:: begin (c)) или полагаться на ADL и начать вызов (c)?
ADL кажется бесполезным в данном конкретном случае - поскольку std:: begin (c) делегирует c.begin(), если это возможно, обычные преимущества ADL, похоже, не применяются. И если все начинают полагаться на ADL, все пользовательские контейнеры должны реализовывать дополнительные функции begin()/end() в своих требуемых пространствах имен. Тем не менее, несколько источников, по-видимому, подразумевают, что рекомендуются неквалифицированные призывы к началу/концу (т.е. https://svn.boost.org/trac/boost/ticket/6357).
Итак, что такое С++ 11? Если авторы контейнерной библиотеки пишут дополнительные функции begin/end для своих классов для поддержки неквалифицированных вызовов начала и конца в отсутствие использования пространства имен std; или используя std:: begin;?