Да, но точно так же, как swap
определяется в разных местах и зависит от ADL, так же, как и begin
и end
. «Универсальные» версии определены в <iterator>
:
// 24.6.5, range access:
template <class C> auto begin(C& c) -> decltype(c.begin());
template <class C> auto begin(const C& c) -> decltype(c.begin());
template <class C> auto end(C& c) -> decltype(c.end());
template <class C> auto end(const C& c) -> decltype(c.end());
template <class T, size_t N> T* begin(T (&array)[N]);
template <class T, size_t N> T* end(T (&array)[N]);
Обратите внимание, что 24.6.5 говорит:
В дополнение к тому, что они доступны через включение заголовка <iterator>
, шаблоны функций в 24.6.5 доступны, когда включены любые из следующих заголовков: <array>
, <deque>
, <forward_list>
, <list>
, <map>
, <regex>
, <set>
, <string>
, <unordered_map>
, <unordered_set>
и <vector>
.