Определение вне класса для static const int

119
27 ноября 2020, 10:40

Насколько мне известно, для типа int инициализировать статические константные члены можно внутри класса, не вынося определение вне класса:

class A {
  static const int x = 42;
}

Класс компилируется. Однако если попробовать получить адрес x из другой единицы трансляции, то получаю linker error:undefined &A::x. С определением вне класса всё работает без ошибок.

Так нужно ли определение вне класса для static const int?

Answer 1

Если вы определили статическую константную переменную внутри класса, то фактически в коде не будет использоваться область памяти с данной константой, а будет просто подстановка константы прямо в код.

И адрес несуществующей переменной вы просто не сможете получить. В любом месте программы.

Если бы вы хотели объявить статическую переменную не константную, то инициализацию в самом классе вам бы просто не дали сделать. (не стандарт) Вам нужно будет определить удалённо данную переменную. И будет вам и память для этой переменной, и адрес.

Если вы не будете искать адрес константы, то можно и не определять в другом месте.

Answer 2

Статические целочисленные переменные можно не определять, если они используются в качестве константного выражения. Начиная с С++17 определение переменной можно сделать прямо внутри класса:

class A {
    static inline int const x{42};
};
Answer 3

Такое объявление A::x, как в вашем примере, не является определением. Нужно или не нужно предоставлять определение для такого члена класса зависит от того, попадает использование такого члена в вашем коде под определение так называемого ODR-использования (ODR-use).

Попросту говоря, если требуется, чтобы для A::x было фактически выделено место в памяти, то A::x придется определить. Если же A::x используется только в константных выражениях времени компиляции, то определения не требуется.

READ ALSO
Как реализовать кнопку “Удалить” на Django?

Как реализовать кнопку “Удалить” на Django?

Я делаю простейшую тудушечкуНужна помощь в реализации удаления выполненных задач

91
Маппинг классов в C# по имени свойств?

Маппинг классов в C# по имени свойств?

Как на C# или через LINQ сделать такое:

114
Размещение remarks документации к методам

Размещение remarks документации к методам

Скажите, куда необходимо помещать блок <remarks>

81
Можно ли с помощью google drive получать видео для unity

Можно ли с помощью google drive получать видео для unity

Ищу варианты для получения видео с облачного хранилищаПришла мысль, что может как то можно получить ссылку на видео с гугл диска в приложение

103