2016-06-06 3 views
-4

В C вы можете сделать это:Статическое сопзЬ без инициализаторе

static const int a; 

int main(){} 

И это, кажется, хорошо. C99 §6.7.8p10 говорит:

Если объект, который имеет длительность статического хранения не инициализируется явно, то:

- если она имеет арифметический тип, он инициализируется (положительный или без знака) нуль;

Аналогично С ++ 14 §3.6.2p2 говорит:

Переменные со статической продолжительностью хранения (3.7.1) или хранения нити длительности (3.7.2) должна быть равна нулю инициализирован (8.5) перед любой другой инициализацией .

Разница заключается в C++ 14 он нужен инициализатор §8.5p7:

Если программа требует инициализации по умолчанию объекта в Const высококвалифицированного типа T, T Shall тип класса с пользовательским конструктором по умолчанию.

Итак, я спрашиваю, почему инициализатор требуется на C++? Не требуется инициализатор, если a не является const, поэтому какая разница делает const здесь, что бы не инициализировать ошибку?

+3

C и C++ - разные языки. –

ответ

0

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

Существующие правила только не включают исключение для типов, где нулевая инициализация достаточно хороша.

Дополнительная языковая функция для поддержки нулевых констант усложнит ситуацию без реального выигрыша.

-1

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

int main() 
{ 
    const int a; 
} 

К сожалению. a имеет автоматическую продолжительность хранения, поэтому он имеет неопределенное значение. И вы не можете изменить его позже ...

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

Если вы хотите a равным нулю, то просто сказать так.Не полагайтесь на неявные правила языка, которые (в случае C) несовместимы. Это плохо для читаемости и ремонтопригодности.

+0

Вопрос о переменной ** файла scope **, а не автоматической переменной. Параметры массива 'int' обрабатываются в 0, поэтому все эти разговоры о неопределенных значениях не имеют значения. –

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