Выражение "using namespace" внутри анонимного пространства имен

При использовании инструкции using namespace внутри анонимного пространства имен приведите пространство имен, используемое в область файла? Например:

namespace foo
{
    int f() { return 1; }
}
namespace
{
    using namespace foo;
}
int a()
{
    return f(); // Will this compile?
}

Ответ 1

В соответствии с пунктом 7.3.4 [namespace.udir] пункт 4 директива пространства имен является транзитивной:

Для неквалифицированного поиска назначается второе пространство имен, которое содержит директивы-указатели, эффект выглядит так, как если бы в первом появлении также появились и директивы using из второго пространства имен.

... и в соответствии с пунктом 7.3.1.1 [namespace.unnamed] 1 есть вид неявной директивы использования для неназванного пространства имен:

Определение без имени-namespace ведет себя так, как если бы оно было заменено на

встроенное пространство имен уникальное {/* пустое тело */}
   использование уникального пространства имен;
   namespace unique {namespace-body}

где встроенная строка появляется в том и только в том случае, если она отображается в определении без имени-namespace, все вхождения уникальной единицы перевода заменяются одним и тем же идентификатором, и этот идентификатор отличается от всех других идентификаторов во всей программе.

Таким образом, ответ "да, это должно быть скомпилировано" (и это происходит со всеми компиляторами на С++, с которыми я его пробовал).

Ответ 2

Да.

Это связано с тем, что анонимное пространство имен автоматически добавляется в область содержимого.

Ответ 3

Да, потому что, как цитирует Dietmar Kühl, анонимное пространство имен заменяется его содержимым.

Однако следует обратить внимание на то, что он заменяется именно там, где он объявлен (редактировать), поэтому в нем нет "магии". Например, это не сработает:

namespace foo
{
    int f() { return 1; }
}

int a()
{
    return f(); // Will this compile?
}

namespace
{
    using namespace foo;
}