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

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

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

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

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

1

Решение

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

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

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

8

Другие решения


По вопросам рекламы [email protected]