Два безымянных пространства имен, определенных в одном и том же декларативном регионе
Рассмотрим следующий код:
#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 ответ
Это в той части, которую вы цитируете:
все вхождения уникальные в единице перевода заменяются одним и тем же идентификатором
Таким образом, все безымянные пространства имен в модуле перевода одинаковы.