Почему символы (функции и переменные), определенные в анонимном пространстве имен, не имеют внутренней связи, как со статическим ключевым словом? Если функция не видна/недоступна снаружи, в чем причина внешней связи?
Почему функции/объекты внутри анонимного пространства имен имеют внешнюю связь?
Ответ 1
В С++ 03 имена с внутренней связью запрещены к использованию в качестве аргументов шаблона [*]. Таким образом, имена большинства вещей в неназванных пространствах имен имели внешнюю связь, позволяющую использовать их с шаблонами. Вы можете явно указать внутреннюю ссылку имени в неназванное пространство имен, объявив его static
, как и в именованном или глобальном пространстве имен.
Обе вещи изменились в С++ 11 - имена в неназванных пространствах имен имеют внутреннюю привязку по умолчанию (3.5/4), а имена с внутренней связью могут использоваться в качестве аргументов шаблона.
[*] для типов, он должен иметь внешнюю связь. Для объектов и функций он должен иметь внешнюю привязку, если его адрес используется как аргумент шаблона, хотя, например, для использования в качестве аргумента шаблона значение целочисленного значения const со внутренней связью можно использовать.