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

#c #namespaces #unnamed-namespace

#c #пространства имен #неназванное пространство имен

Вопрос:

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

 #include<iostream>

namespace
{
    int a = 5;
}

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

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

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

Но неназванное определение пространства имен не является оригинальным-namespace-definition и в разделе 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 появляется тогда и только тогда, когда он появляется в
unnamed-namespace-definition , все вхождения unique в
единице перевода заменяются одним и тем же идентификатором, и этот
идентификатор отличается от всех других идентификаторов во всей программе.

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

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

Ответ №1:

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

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

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

Комментарии:

1. Это было мое недопонимание. Большое спасибо.