На основе диапазона для циклов и ADL

В стандартном рабочем проекте C ++ 0x указывается (раздел 6.5.4) следующее о вызовах begin () и end (), которые неявны в цикле for на основе диапазона: поиск, зависящий от аргументов (3.4.2). За цели этого поиска имени, пространство имен std является связанным

Как я это читал, это означает, что разрешение перегрузки, установленное для вызовов begin () и end (), включает в себя все следующее:

  • все перегрузки begin () и end (), которые являются в области видимости в том месте, где используется цикл for на основе диапазона (в частности, все перегрузки в глобальном пространстве имен будут в области видимости)
  • все перегрузки begin () и end () в пространстве имен std
  • все перегрузки of 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 не ошибаюсь не допускается)?

6
задан HC4 - reinstate Monica 5 March 2011 в 01:30
поделиться