Почему gcc, clang и msvc успешно компилируют следующий код? (божья стрела)
Код: Выделить всё
namespace impl {
class A;
} // namespace impl
namespace api {
using namespace impl;
} // namespace api
class B
{
friend class api::A; // (1)
};
На мой взгляд, этот конкретный вид объявления друга требует тщательно продуманного спецификатора типа. Спецификатор подробного типа — это ключевое слово class, за которым следует имя класса. Но в этой единице перевода нет класса с именем api::A. Директива using не объявляет такой класс, она влияет только на правила поиска имени. Поэтому я ожидаю, что компиляция строки с пометкой (1) завершится ошибкой, поскольку в пространстве имен API нет класса A. Но основные компиляторы это принимают... Чего мне не хватает?
И следующий вопрос: если бы я заменил директиву using using namespace impl; на using-declaration using impl: :A;, это действительно объявит имя A в пространстве имен API, что сделает код правильно сформированным?
Подробнее здесь:
https://stackoverflow.com/questions/790 ... -as-elabor