#опытным
Одной неприятной особенностью static_assert еще с С++11 были ограничения на сообщения об ошибках. По сути могли использоваться только строковые литералы. ТО есть просто фиксированные строки. Никаких динамических преобразований:
template <class T>
void g() {
static_assert(sizeof(T) == 4, "Type T size is not 4");
}
Из сообщения об ошибке компиляции:
error: static assertion failed: Type T size is not 4 мы узнаем лишь то, что размер не равен 4. Хотя, вообще говоря, было бы неплохо увидеть размер переданного типа прямо в сообщении об ошибке для упрощения дебага. Но сделать мы этого не могли, даже константные выражения не могли использоваться.
До С++26, когда завезли константные выражения в сообщения об ошибках. После запятой может быть объект
msg, у которого должны быть 2 constexpr метода .data() для получения указателя на начало строки и .size() для получения размера.Это позволило использовать различные библиотеки форматирования внутри сообщения об ошибке. Например std::format:
template <class T>
void f() {
static_assert( sizeof(T) == 4,
std::format("Type T size should be 4, actual: {}", sizeof(T)) );
}
int main() {
f<std::int32_t>();
f<std::int64_t>();
}
И это работает уже на gcc.
Так что внутри static_assert теперь разрешены любые выкрутасы, главное чтобы они были константными выражениями.
Be flexible. Stay cool.
#cpp26