Рассмотрим следующий код:
#include<iostream>
namespace
{
int a = 5;
}
namespace
{
int a = 5;
}
int main()
{
int i=5;
{
std::cout << i;
}
}
Этот код недействителен. Это потому, что переопределение a
произошло Но я ожидал, что это действительно так. Собственно, сек 3.3.6 / 1 сказал:
[…] Потенциальная сфера, обозначенная оригинал-пространства имен имя это
объединение декларативных регионов, установленных каждым из
Определения пространства имен в той же декларативной области с этим
оригинал-пространства имен имя.[…]
Но безымянное определение пространства имен не является оригинальным-определением пространства имен и сек. 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 появляется тогда и только тогда, когда
определение без имени-пространства-имен, все вхождения уникальных в
единицы перевода заменяются тем же идентификатором, а это
идентификатор отличается от всех других идентификаторов во всей программе.
Это означает, что два безымянных пространства имен имеют разные уникальный.
Можете ли вы объяснить поведение в коде, который я привел?
Это в той части, которую вы цитируете:
все случаи уникальный в блоке перевода заменяются одним и тем же идентификатором
Таким образом, все безымянные пространства имен в модуле перевода одинаковы.