Следующий код генерирует ошибку call of overloaded ‘bar()’ is ambiguous, которая должна быть такой, как у меня есть функция bar в глобальном и foo пространстве имен, и я вызывал директиву using namespace foo.
namespace foo {
void bar() {}
}
void bar() {}
using namespace foo;
int main() {
bar();
}
Я тоже ожидал ту же ошибку со следующим кодом:
#include <cstdlib>
#include <iostream>
int abs(int n) {
return n > 0 ? n : -n;
}
using namespace std;
int main() {
int k;
cin >> k;
cout << abs(k) << endl;
}
Я определил функцию int abs(int n) как ту, что присутствует в cstlib, и я назвал директиву using namespace std. Таким образом, должна быть ошибка, подобная первому примеру. Но их нет.
Мой вопрос в том, как компилятор разрешает эту двусмысленность? Какую функцию вызывать в таких случаях, мой или std один? Есть ли здесь UB?
Обновление. Из комментариев и ответов кажется, что разные компиляторы ведут себя по-другому. Так это поведение undefined или реализация определена?
Я тестировал его с g++ 4.8.4 на Ubuntu 14.04 с флагом -std=c++11.
[Обратите внимание, что я понимаю, что using namespace std плохой, а моя функция abs не лучше или даже хуже, чем std one. Мой вопрос другой.]