В стандартном рабочем проекте C ++ 0x указывается (раздел 6.5.4) следующее о вызовах begin () и end (), которые неявны в цикле for на основе диапазона: поиск, зависящий от аргументов (3.4.2). За цели этого поиска имени, пространство имен std является связанным
Как я это читал, это означает, что разрешение перегрузки, установленное для вызовов begin () и end (), включает в себя все следующее:
Это правильно?
Поведение g ++ 4.6, похоже, не согласуется с этой интерпретацией. Для этого кода:
#include
template
T begin(const std::pair& p);
template
U end(const std::pair& p);
int main()
{
std::pair p;
for (int x : p)
;
}
Он дает следующие ошибки:
adl1.cpp: In function 'int main()':
adl1.cpp:12:18: error: No match for 'begin(pair &)'
adl1.cpp:12:18: candidate is:
/usr/local/lib/gcc/i686-pc-linux-
gnu/4.6.0/../../../../include/c++/4.6.0/initializer_list:86:38: template<
class _Tp> constexpr const _Tp * begin(initializer_list<_Tp>)
adl1.cpp:12:18: error: No match for 'end(pair &)'
adl1.cpp:12:18: candidate is:
/usr/local/lib/gcc/i686-pc-linux-
gnu/4.6.0/../../../../include/c++/4.6.0/initializer_list:96:36: template<
class _Tp> constexpr const _Tp * end(initializer_list<_Tp>)
Это говорит о том, что он рассматривает только перегрузки в пространстве имен std, а не перегрузки в глобальном пространстве имен.
Если, однако, , m не ошибаюсь не допускается)?