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

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


person Belloc    schedule 04.07.2015    source источник
comment
Какую практическую проблему это вызывает у вас?   -  person Lightness Races in Orbit    schedule 04.07.2015
comment
@LightnessRacesinOrbit: этот вопрос относится к языку. Для того, чтобы такие вопросы были интересны, не должно быть никаких практических проблем. Есть про определение языка программирования.   -  person Supremum    schedule 05.07.2015
comment
Ответ на этот связанный вопрос решает этот вопрос: stackoverflow.com/questions/31224886/ Обратите внимание, что пример [namespace.udecl]/10 неверен и только что был изменен в ответ на мой связанный вопрос.   -  person Supremum    schedule 06.07.2015
comment
Этот вопрос также кажется очень связанным: stackoverflow.com/questions/4252451/   -  person Supremum    schedule 06.07.2015
comment
@Supremum Спасибо за ссылки   -  person Belloc    schedule 06.07.2015


Ответы (1)


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

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

person Mark Lakata    schedule 04.07.2015
comment
Не могли бы вы предоставить цитату из стандарта? - person Belloc; 04.07.2015
comment
Ответ на этот связанный вопрос решает этот вопрос: stackoverflow.com/questions/31224886/ Обратите внимание, что пример [namespace.udecl]/10 неверен и только что был изменен в ответ на мой связанный вопрос. - person Supremum; 06.07.2015