Следующий код генерирует ошибку 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. Мой вопрос другой.]