Являются ли объекты в анонимном пространстве имен неявно статичными? - программирование
Подтвердить что ты не робот

Являются ли объекты в анонимном пространстве имен неявно статичными?

Из стандартной точки зрения С++ 11 существует техническая разница между статусом/свойствами объекта:

namespace
{
   int foo;
   const int bar = 42;
}

и

namespace
{
   static int foo;
   static const bar = 42;
}

?


Из вопросов и ответов вокруг здесь я верил, что объекты в анонимном пространстве имен неявно статичны, но кто-то говорит мне, что ссылка только внутренняя, компилятор не будет воспринимать объект так, как если бы он был помечен как статический с такими последствиями, как это будет реализовывать строительство объекта. Поэтому мне нужны некоторые подробности о том, что это на самом деле означает, если есть разница между статикой и без нее в анонимном пространстве имен.

4b9b3361

Ответ 1

С++ 11, 3.5/4:

Неименованное пространство имен или пространство имен, объявленное прямо или косвенно внутри неназванного пространства имен есть внутренняя связь. Все остальные пространства имен имеют внешнюю связь. Имя с областью пространства имен, которая не была данная внутренняя связь выше имеет ту же связь, что и охватывающая пространство имен, если это имя - переменная...

Итак, в С++ 11 у обоих ваших объектов foo есть внутренняя связь. В С++ 03 первая имеет внешнюю связь.

Независимо от привязки, он имеет статическую продолжительность хранения.

Я не думаю, что в стандарте есть такая вещь, как "взять объект, как если бы он был помечен как статический", поэтому я не могу ответить на это. Если вы найдете какой-либо текст в стандарте, который ссылается на то, что объект "помечен как статический", и не ссылается конкретно на связь или продолжительность хранения, тогда ссылайтесь на него, и я могу дать вам мнение: -)

Ответ 2

Существует очень большая разница: с static имя имеет внутреннюю привязку; без него он имеет внешнюю связь (но находится в пространстве имен, которое вы не можете указать в другой единицы перевода). Разница не всегда важна, но она вступает в игру в нескольких случаях: если у вас есть шаблон с параметром int*, например, вы не можете создать экземпляр на &foo, если объявлен foo static.

EDIT:

Как отметил Стив Джессоп, это верно только в С++ 03. С++ 11 делает здесь изменения. Хотя я не знаю, почему; Я нахожу, что спецификация С++ 03 более согласованная — пространство имен что-то внутри не должно влиять на связь.