Почему нужно повторять спецификатор const во время определения, если объявление как const выполняется где-то еще?

После решения этой простой проблемы мне пришлось спросить :

-> В файле H в классе ex определен статический член const, например. :

class ex {
    const static int my_ex;
};

-> В файле CPP значение указывается

ex::my_ex = 32;  

И тогда выдается ошибка «конфликтующие объявления» (а также «не называет тип»). Я понимаю, что определение в файле CPP также является объявлением, которое действительно создает конфликт, видимый со стороны компоновщика, НО почему только о спецификаторе const (и введите), а не статический? Мне нужно только написать

const int ex::my_ex = 32;

чтобы заставить его скомпилировать. Но не статично ... Почему бы и нет? Почему я не могу просто определить и не повторять объявление связанных шагов (тип, конкретные идентификаторы)?


person C. THIN    schedule 18.04.2016    source источник
comment
static никогда не используется для определений.   -  person πάντα ῥεῖ    schedule 18.04.2016
comment
Хорошо ... но почему на самом деле мой вопрос ...   -  person C. THIN    schedule 18.04.2016
comment
Статичность в объявлении и статика в определении означают разные вещи.   -  person SergeyA    schedule 18.04.2016
comment
@ πάνταῥεῖ это технически неверно. struct X { static const int x = 42; };   -  person SergeyA    schedule 18.04.2016
comment
Все типизированные объекты имеют только один тип. Вы не можете указать разные типы для одной и той же сущности в разное время. static отличается, потому что это не часть типа.   -  person Kerrek SB    schedule 18.04.2016
comment
@SergeyA Хорошо, в сторону встроенных определений.   -  person πάντα ῥεῖ    schedule 18.04.2016
comment
@SergeyA: Это не определение. Это объявление и инициализатор.   -  person Kerrek SB    schedule 18.04.2016
comment
@SergeyA На самом деле правильно, но на самом деле это не отвечает на вопрос. Если бы они решили не заставлять писателя переписывать слово static, то они могли бы сделать то же самое для слова const ...   -  person C. THIN    schedule 18.04.2016
comment
Вопрос действительно не сильно отличается от того, почему вы не можете объявить extern int a; extern char a;   -  person Kerrek SB    schedule 18.04.2016
comment
Вы все отвечаете немного быстро, мог бы кто-нибудь подвести итог определению, объявлению, инициализации, ключевым словам, связанным с типом, другим ключевым словам, или значениям ключевых слов в зависимости от контекста? Было бы здорово.   -  person C. THIN    schedule 18.04.2016
comment
Похоже, вы просите описание того, как работает C ++. Вот и все: stackoverflow.com / questions / 388242 /   -  person Lightness Races in Orbit    schedule 18.04.2016
comment
Вы либо спрашиваете, почему const нужно дать снова, либо почему static не. (Или почему есть несоответствие.) Что это такое? И почему? Какую проблему ты пытаешься решить?   -  person Lightness Races in Orbit    schedule 18.04.2016
comment
@KerrekSB да, я ошибался. Но в более правильном примере со статической функцией-членом со встроенным определением static все равно будет использоваться для определения.   -  person SergeyA    schedule 18.04.2016
comment
Почему я не могу просто определить и не повторять шаги, связанные с объявлением - на мой взгляд, повторение спецификаторов полезно: читать код удобнее, у вас есть более важная информация о членах, не открывая заголовок. Но несколько непоследовательно то, что вы не можете поставить static для определения bc, противоречащего другой семантике.   -  person Oleksa    schedule 15.07.2020


Ответы (1)


Это историческая вещь.

Поскольку C, static по определению означает «внутренняя связь». Когда появился C ++ и к нему были добавлены классы, Бьярну понадобилось ключевое слово для обозначения статических членов. Не желая добавлять новые ключевые слова (предпочтение, которое в значительной степени существует до сих пор), он вместо этого повторно использовал static.

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

Помимо этого, это просто. Когда вы создаете язык, вы балансируете между простотой спецификации, простотой реализации и простотой использования, и вы придумываете набор правил, которые и являются языком. В какой-то момент вам нужно перестать спорить о том, «почему» было создано какое-то несущественное правило, и просто продолжить писать свою программу.

person Lightness Races in Orbit    schedule 18.04.2016