Насколько мне известно, для типа int
инициализировать статические константные члены можно внутри класса, не вынося определение вне класса:
class A {
static const int x = 42;
}
Класс компилируется. Однако если попробовать получить адрес x из другой единицы трансляции, то получаю linker error:undefined &A::x
. С определением вне класса всё работает без ошибок.
Так нужно ли определение вне класса для static const int
?
Если вы определили статическую константную переменную внутри класса, то фактически в коде не будет использоваться область памяти с данной константой, а будет просто подстановка константы прямо в код.
И адрес несуществующей переменной вы просто не сможете получить. В любом месте программы.
Если бы вы хотели объявить статическую переменную не константную, то инициализацию в самом классе вам бы просто не дали сделать. (не стандарт) Вам нужно будет определить удалённо данную переменную. И будет вам и память для этой переменной, и адрес.
Если вы не будете искать адрес константы, то можно и не определять в другом месте.
Статические целочисленные переменные можно не определять, если они используются в качестве константного выражения. Начиная с С++17 определение переменной можно сделать прямо внутри класса:
class A {
static inline int const x{42};
};
Такое объявление A::x
, как в вашем примере, не является определением. Нужно или не нужно предоставлять определение для такого члена класса зависит от того, попадает использование такого члена в вашем коде под определение так называемого ODR-использования (ODR-use).
Попросту говоря, если требуется, чтобы для A::x
было фактически выделено место в памяти, то A::x
придется определить. Если же A::x
используется только в константных выражениях времени компиляции, то определения не требуется.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я делаю простейшую тудушечкуНужна помощь в реализации удаления выполненных задач
Ищу варианты для получения видео с облачного хранилищаПришла мысль, что может как то можно получить ссылку на видео с гугл диска в приложение