Подтвердить что ты не робот

Объявление использования не может повторяться в области функций. Почему это?

В [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
}

Этот фрагмент компилируется в clang.

4b9b3361

Ответ 1

Первый - это объявление внутри пространства имен, а краткие операторы использования могут часто встречаться с использованием #includes. Второй - внутри определения функции, и вы никогда не сделаете этого, если не допустили ошибку. Вы не можете определить один и тот же символ дважды, например, но вы можете объявить несколько раз.

Оператор using также является не просто объявлением. Он немного сильнее, поскольку он импортирует функцию из одного пространства имен в другое. Например, он может вытащить функцию защищенного базового класса в производный класс, делая его общедоступным. Это почти определение связью.