Ответ 1
Как указано в комментариях @dyp, вы можете злоупотреблять оператором запятой и лямбда-выражением:
([]{static_assert(true,"");}, 42)
В С++ 11 законно писать, например:
int b = (some_function_returning_void(), 1020);
И вы вернетесь 1020. Но это не позволит вам написать:
int b = (static_assert(2 > 1, "all is lost"), 304);
Документация объясняет юридические места, где может возникнуть static_assert (keyword):
Объявление статического утверждения может отображаться в области блока (как объявление блока) и внутри тела класса (как объявление участника)
Просто для этого я пробовал пару вещей, пока это не сработало:
int b = ({static_assert(2 > 1, "all is lost"); 304;});
Но с -Wpedantic
я получаю "warning: ISO C++ forbids braced-groups within expressions"
. Интересно, что они называются выражениями выражения и , используемыми в ядре Linux.
Но представьте себе, что я хочу остаться -Wpedantic
. Существуют ли какие-либо чистые обходные пути?
Как указано в комментариях @dyp, вы можете злоупотреблять оператором запятой и лямбда-выражением:
([]{static_assert(true,"");}, 42)
static_assert
не выражение (в отличие от sizeof
), поэтому вы не можете использовать его там, где требуется выражение.
Это даже выражение с типом void
(интересно, throw
является выражением типа void
), поэтому вы даже не можете использовать его в тернарном режиме.
Выражения операторов не являются стандартными С++, поэтому я бы посоветовал их не использовать.
Лямбда
int b = []{
static_assert(2 > 1, "all is lost"); return 304;
}();
или
int b = ([]{static_assert(2 > 1, "all is lost");}, 304);
едва ли чист. (Вторая лямбда выглядит как ширина волос от undefined).
Как насчет шаблона функции:
template<int T> void my_static_assert()
{
static_assert(T, "asserted");
}
Затем вы можете использовать оператор запятой, вам даже не нужно вызывать функцию:
int x = (my_static_assert<(2 > 1)>, 2001);
Возможно, вам нужны несколько круглых скобок здесь и там, чтобы сделать парсер счастливым. И вы теряете сообщение static assert, но оно работает.