Объявление использования не может повторяться в области действия функции. Это почему?
В [namespace.udecl]/10 у вас есть следующий пример:
namespace A {
int i;
}
namespace A1 {
using A::i;
using A::i; // OK: double declaration
}
void f() {
using A::i;
using A::i; // error: double declaration
}
Этот фрагмент компилируется в лязг.
1 ответ
Первое - это объявление внутри пространства имен, а операторы множественного использования могут часто происходить с использованием #include. Второе - внутри определения функции, и вы бы никогда этого не сделали, если бы не сделали ошибку. Например, вы не можете определить один и тот же символ дважды, но вы можете объявить несколько раз.
Оператор using - это не просто объявление. Это немного сильнее, так как он импортирует функцию из одного пространства имен в другое. Например, он может вытянуть защищенную функцию-член базового класса в производный класс, сделав его общедоступным. Это почти определение по связи.