C ++ семантика `статическое const` против` const` - PullRequest
130 голосов
/ 14 сентября 2010

В частности, в C ++, каковы семантические различия, например:

static const int x = 0 ;

и

const int x = 0 ;

для static в качестве связующего звена и спецификатора класса хранения (т.е.внутри и снаружи функции).

Ответы [ 2 ]

116 голосов
/ 14 сентября 2010

В области видимости файла нет разницы в C ++. const делает внутреннюю связь по умолчанию, и все глобальные переменные имеют статическое время жизни. Но первый вариант имеет такое же поведение в C, так что это может быть хорошей причиной для его использования.

Внутри функции вторая версия может быть вычислена из параметров, в C или C ++ она не должна быть константой времени компиляции, как этого требуют некоторые другие языки.

Внутри класса, в основном то же самое, что и для функций, значение const экземпляра можно вычислить в ctor-initializer-list . static const устанавливается во время инициализации при запуске и остается неизменным для остальной части программы. (Примечание: код для static членов выглядит немного иначе, потому что объявление и инициализация разделены.)

Помните, что в C ++ const означает только для чтения , а не константа . Если у вас есть указатель на const, то другие части программы могут изменить значение, пока вы не смотрите. Если переменная была определена с помощью const, то никто не может изменить ее после инициализации, но инициализация все еще может быть сколь угодно сложной.

2 голосов

C ++ 17 стандартный черновик для const подразумевает static в области действия файла

Это цитата из того, что было упомянуто в: https://stackoverflow.com/a/3709257/895245

C ++ 17 n4659 стандартный черновик 6.5 «Программа и связь»:

3 Имя с областью пространства имен (6.3.6) имеет внутреннюю связь, если оно является именем

  • (3.1) - переменная, функция или шаблон функции, которые явно объявлены статическими;или
  • (3.2) - не встроенная переменная энергонезависимого типа с константной квалификацией, которая явно не объявлена ​​как extern и не была ранее объявлена ​​как имеющая внешнюю связь;или
  • (3.3) - член данных анонимного объединения.

Приложение C (информативное) Совместимость, C.1.2 В пункте 6: «основные понятия» даетобоснование того, почему это было изменено с C:

6.5 [также 10.1.7]

Изменение: имя области действия файла, которая явно объявлена ​​как const, а не явно объявлена ​​как extern, имеетвнутренняя связь, в то время как в C она будет иметь внешнюю связь.

Обоснование: поскольку объекты const могут использоваться в качестве значений во время перевода в C ++, эта функция призывает программистов предоставлять явный инициализатор для каждого объекта const.Эта функция позволяет пользователю помещать константные объекты в исходные файлы, включенные в несколько единиц перевода.

Эффект на исходную функцию: изменение семантики четко определенной функции.

Сложностьпреобразование: семантическое преобразование.

Насколько широко используется: Редко.

См. также: Почему const подразумевает внутреннюю связь в C ++, а не в C?

Что вы, скорее всего, хотите сделать вместо заголовков

Подробно объяснено по адресу: Что означает «const static» в C и C ++?

  • pre C ++ 17: extern в заголовке, определение в файле cpp
  • post C ++ 17: встроенная переменная в заголовке
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...