Я немного не понимаю, какова точная причина компиляции следующего кода (и он не является неправильным):
Код: Выделить всё
namespace A
{
void f() { }
}
namespace B
{
void f() {}
}
int main()
{
using A::f;
using namespace B;
f();
}
Мы различаем директиву использования и декларацию использования. Последний, будучи декларацией, добавляет объявления в декларативную область программы, тогда как первый просто делает определенные имена пригодными для использования в этой области. Очевидно, что директива using в этом отношении имеет гораздо меньшую силу. Таким образом, когда мы вызываем f(), поскольку мы уже объявили имя f в декларативной области с помощью объявления using, во время поиска квалифицированного имени (
, ::something), имена в B вообще не будут проверяться.
Но потом я вспомнил о f(), компилятор будет используйте неквалифицированный поиск.
Подробнее здесь:
https://stackoverflow.com/questions/786 ... irective-i