#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. Это было мое недопонимание. Большое спасибо.