Начиная с C ++ 17, с введением встроенных переменных, static constexpr
члены данных являются неявно встроенными переменными:
[dcl.constexpr]
1 ... Функция или член статических данных, объявленные с помощью спецификатора constexpr, неявно являются встроенной функцией или переменной ([dcl.inline]) ...
Inlineпеременные, как встроенные функции, определены в каждой единице перевода, в которой они используются. И компилятор преобразует несколько определений в одно.Это означает, что в отличие от C ++ 14, нет необходимости явно предоставлять определение вне класса для переменной static constexpr
ради ODR, об этом позаботится компилятор.
Вы можетеи сойти с рук в C ++ 14 тоже.Как и в другом ответе, resize
использует в ODR элемент статических данных.Вы можете обойти это, хотя:
classy.resize(3, int(VALUE_LIMIT_A));
Хотя это выглядит излишним, оно фактически отличается от использования константы напрямую.Это создает временное целое число со значением от константы.Но это не ODR-использовать константу.Вместо этого временная привязка связана со ссылкой, поэтому проблема устранена.Хотя константу лучше определять в коде, предшествующем C ++ 17, этот прием можно использовать для адаптации кода, который вы не можете контролировать.