Почему в C ++ проводилось какое-либо различие между статическими глобальными переменными (внутренняя связь) и символами в безымянном пространстве имен (внешняя связь, но в любом случае нет возможности ссылаться на нее извне) при представлении последнего?
Какие-либо из этих причин все еще действительны, или есть новые?
Есть ли места, где они все еще различны, кроме произвольного правила, которым должны быть анонимные глобальные (или пространства имен) союзы
static
, и каковы они?Для бонусных баллов, если не осталось веских причин для их отличия, есть ли просьба сделать их эквивалентными?
Когда C ++ ввел пространства имен (C ++ 98) и, в частности, безымянные пространства имен, статические глобальные перемены устарели как устаревшие и уступали новым в борьбе за энтузиазм, хотя это было отменено в C ++ 11 :
Устаревание статического ключевого слова… больше не надо?
До C ++ 11 символы с внутренней связью не могли использоваться в качестве аргументов шаблона: почему C ++ 03 требовал, чтобы параметры шаблона имели внешнюю связь?
Ответы:
Я не думаю, что это отвечает на все ваши вопросы (или любые из них?), Но ключевое различие между статическими объявлениями на уровне файлов и анонимными пространствами имен заключается в том, что пространства имен также применяются к типам (вы не можете объявить
static
тип в в том же смысле, что вы объявляете переменную), поэтому пространство имен предпочтительнее, поэтому существует одна идиома для объявления данных и типов в рамках файла.Например, следующий код должен хорошо скомпилироваться. (Не очень полезно, так как вы не можете различить оба типа, но допускается)
Живой тест здесь .
источник
struct Foobar
? Хуже того, предположим, что сейчасclass Foobar
. Подумайте, как вы планируете создавать конструкторы для них обоих.