оператор "using namespace" внутри анонимного пространства имен - PullRequest
15 голосов
/ 08 января 2012

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

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

Ответы [ 3 ]

15 голосов
/ 08 января 2012

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

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

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

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

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

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

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

3 голосов
/ 08 января 2012

Да.

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

1 голос
/ 08 января 2012

Да, потому что, как цитирует Дитмар Кюль, анонимное пространство имен заменяется его содержимым.

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

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

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

namespace
{
    using namespace foo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...