Подтвердить что ты не робот

Есть ли способ сместить static_assert в выражение в ISO С++ 11?

В С++ 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. Существуют ли какие-либо чистые обходные пути?

4b9b3361

Ответ 1

Как указано в комментариях @dyp, вы можете злоупотреблять оператором запятой и лямбда-выражением:

([]{static_assert(true,"");}, 42)

Live on Coliru

Ответ 2

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).

Ответ 3

Как насчет шаблона функции:

template<int T> void my_static_assert()
{
    static_assert(T, "asserted");
}

Затем вы можете использовать оператор запятой, вам даже не нужно вызывать функцию:

int x = (my_static_assert<(2 > 1)>, 2001);

Возможно, вам нужны несколько круглых скобок здесь и там, чтобы сделать парсер счастливым. И вы теряете сообщение static assert, но оно работает.