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

Рассмотрим следующий код:

#include<iostream>

namespace
{
    int a = 5;
}

namespace
{
    int a = 5;
}
int main()
{ 
    int i=5;
    {
        std::cout << i;
    }
}

Этот код недействителен. Это потому, что переопределение a произошло Но я ожидал, что это действительно так. Собственно, сек 3.3.6/1 сказал:

[...] Потенциальная область, обозначаемая исходным-namespace-name, является объединением декларативных областей, установленных каждым из определений пространства имен в той же декларативной области с тем оригинальным-namespace-name. [...]

Но безымянное определение пространства имен не является оригинальным-определением пространства имен и сек. 7.3.1/1 сказал:

namespace-name:
    original-namespace-name
    namespace-alias
original-namespace-name:
    identifier

а также

original-namespace-definition:
    inline_opt namespace identifier { namespace-body }

Причем сек. 7.3.1.1 сказано:

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

inlineopt namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

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

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

Можете ли вы объяснить поведение в коде, который я привел?

1 ответ

Решение

Это в той части, которую вы цитируете:

все вхождения уникальные в единице перевода заменяются одним и тем же идентификатором

Таким образом, все безымянные пространства имен в модуле перевода одинаковы.

Другие вопросы по тегам