2010-09-09 3 views
4

A recent thread on SO triggerred this.Анонимное пространство имен

Анонимное пространство имен считается эквивалентным

namespace unique { /* empty body */ } 
    using namespace unique; 
    namespace unique { namespace-body } 

я не вспомнить точную причину, почему она не эквивалентна

namespace unique { namespace-body } 
    using namespace unique; 

также попытался поиска (в том числе Google), но напрасно. Пожалуйста, поделитесь любой информацией, имеющейся у вас в этом отношении.

+4

Кстати, технический термин «неназванный пространство имен». – GManNickG

ответ

4

Спецификация, которая существует сейчас, была введена в 1995 году в N0783 для исправления углового случая. Процитируем эту бумагу (стр 9):

В БК определяет семантику безымянного пространства имен как эквивалент:

namespace UNIQUE { 
    // namespace body 
} 
using namespace UNIQUE; 

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

namespace {} // If you remove this line, the 
      // use of ::f below is invalid 

namespace { 
    void f() 
    { 
     using ::f; 
    } 
} 

В БК должен быть изменен, чтобы определить безымянный пространство имен как эквивалент:

namespace UNIQUE {} 
using namespace UNIQUE; 
namespace UNIQUE { 
    // namespace body 
} 
+0

На самом деле, я не понимаю его полностью. Deos означает, что показанный фрагмент кода должен быть хорошо сформирован в текущем стандарте? – Chubsdad

+0

Да - использование 'use :: f' следует за' использованием пространства имен UNIQUE'. Поэтому 'UNIQUE :: f' вводится в глобальное пространство имен в точке, где код ссылается на' :: f' – MSalters

Смежные вопросы