Неоднозначный вызов функций в C++ в разных пространствах имен

Это сбило с толку меня и нескольких коллег -, но мы проверили, что это ошибка примерно в 5 различных компиляторах. Все они возвращают, что этот небольшой фрагмент кода -является «неоднозначным».

namespace foo {
  struct type_t {
    int x;
  };
  void bar( type_t & );
}

void bar( foo::type_t & );

void func( void ) {
  foo::type_t x = { 10 };
  bar(x);
}

Clang возвращает следующее:

func.cpp:12:3: error: call to 'bar' is ambiguous
  bar(x);
  ^~~
func.cpp:5:8: note: candidate function
  void bar( type_t & );
       ^
func.cpp:8:6: note: candidate function
void bar( foo::type_t & );
     ^
1 error generated.

Почему это происходит? В коде нет операторов «использования». Порядок разрешения не должен включать пространство имен foo, так почему он ищет там? Почему это двусмысленно?

5
задан Jonathan Sternberg 19 April 2012 в 19:18
поделиться