Anatoly
Хочу обсудить следующий код и как на это должен реагировать компилятор, когда из constexpr функции вызывается не constexpr функция?
Anatoly
[[noreturn]] inline void fail(const char *message, const char *file, int line) { log(message, file, line); // Crash with access violation and generate crash report. volatile auto nullptr_value = (int*)nullptr; *nullptr_value = 0; // Silent the possible failure to comply noreturn warning. std::abort(); } inline constexpr void validate(bool condition, const char *message, const char *file, int line) { (GSL_UNLIKELY(!(condition))) ? fail(message, file, line) : noop(); } а какой профит от constexpr в функции validate, если вызывается не constrexpr функция fail?
Berkus
Когда взламывали PS4 для запуска Linux там обнаружился переизобретённый PCI, а вы говорите)
японский инженерный гений изобретателен да, велосипедят только в путь
Igor
Хочу обсудить следующий код и как на это должен реагировать компилятор, когда из constexpr функции вызывается не constexpr функция?
ill-formed, если верить цитатам из стандарта на SO 7.1.5 paragraph 5 For a `constexpr` function, if no function argument values exist such that the function invocation substitution would produce a constant expression (5.19), the program is ill-formed; no diagnostic required. https://stackoverflow.com/questions/22176777/why-can-i-call-a-non-constexpr-function-inside-a-constexpr-function
Илья
при false GSL_UNLIKELY(!(condition)) функция полностью constexpr, если параметры вычислимы на этапе компиляции
Илья
validate(true, ...) => fail(...) в рантайме
Anatoly
validate(true, ...) => fail(...) в рантайме
то есть здесь все валидно?
Anatoly
inline constexpr void validate(bool condition, const char *message, const char *file, int line) { (*) (GSL_UNLIKELY(!(condition))) ? fail(message, file, line) : noop(); } 3>h:\tmp\kepka\telegram\sourcefiles\base/assertion.h(47): error C3249: illegal statement or sub-expression for 'constexpr' function
Илья
то есть здесь все валидно?
я не знаю что в методе GSL_UNLIKELY. если GSL_UNLIKELY может в компайл тайме вычислить false то вызывается noop. она тоже вычислима на этапе компиляции. получается все машинные инструкции вычислимы компилятором. если GSL_UNLIKELY может в компайл тайме вычислить true то ваш вызов validate заменяется вызовом fail. так как функция fail не помечена как constexpr то она преобразуется в машинный код компилятором и вызовется во время выполнения
Pavel
Inspector – A drop-anywhere C++ REPL (Score: 103+) Link: http://j.mp/2G57Jq3 Comments: http://j.mp/2ECG2rC
Berkus
на клинге сделано
Илья
это макрос #define GSL_UNLIKELY(c) !!(c)
(GSL_UNLIKELY(!(condition))) -> (!!(!(condition))) ->!condition
Anatoly
(GSL_UNLIKELY(!(condition))) -> (!!(!(condition))) ->!condition
Спасибо большое за разъяснение!
Anatoly
То есть, MSVC 2015 ошибается, ломаясь на этом коде.
Илья
То есть, MSVC 2015 ошибается, ломаясь на этом коде.
к сожалению да. По стандарту constexpr функция должна возвращать literal type. С С++14 void является литеральным типом, но VS2015 это не поддерживает
Igor
@bataloviluxa а наоборот запутался :( получается, любая цепочка вызовов constexpr -> not-constexpr происходит в рантайме?
🦥Alex Fails
да
Igor
тогда я не понял процитированный мною же параграф из стандарта "if no function argument values exist such that the function invocation substitution would produce a constant expression, the program is ill-formed" возвращаемый fail void считается за literal constant expression, поэтому validate не является ill-formed?
Илья
функция помечается constexpr если все входные параметры функции вычислимы на этапе компиляции, то результат вычисляется компилятором если constexpr функция вызывает в себе не constexpr функцию, то то что происходит в constexpr функции вычисляется компилятором а остальное уходит в рантайм в примере выше, если GSL_UNLIKELY(!(condition)) вычислимо компилятором то два варианта:
Илья
если false то noop() - noop constexpr. всё constexpr
Илья
если true то в рантайме вызовется fail
Илья
то есть в машинном коде будет отсутсвовать инструкция GSL_UNLIKELY(!(condition)), так как ее результат известен во время компиляции
Berkus
это если condition известен во время компиляции
Илья
это если condition известен во время компиляции
ага. если нет то все в рантайм
Igor
ок, теперь понял, спасибо)
Max
кто-нибудь, обьясните, как этот синтаксис работает под капотом template<typename... Args> void readln(Args&... args) { ((cin >> args), ...); }
vladislav
решебник?) лол
vladislav
мне бы решебник тасок в jira
Berkus
мне бы решебник тасок в jira
https://twitter.com/FakeRyanGosling/status/963207849127043072/photo/1
Arseny
Может нужен бот, который всех вступающих будет в @supapro отправлять? Он, конечно, будет ошибаться, но очень редко.
Berkus
на 2500 участников просто включим автобанилку
vladislav
на 2500 участников просто включим автобанилку
А вдруг страуструп и саттер решат заглянуть?
vladislav
будут в @supapro сидеть
Egor
Cтрауструп в супапро как раз будет молодёжь учить
Igor
на 2500 участников просто включим автобанилку
фейлсу станет скучно, он научит бота чистить мёртвые души не писавшие больше полугода, и участников станет обратно 1250
Anatoly
А вдруг страуструп и саттер решат заглянуть?
надо просто на входе сразу ~полотенце~ вопрос под ноги кидать
vladislav
темплейты
Viacheslav
Какие вы жестокие.
vladislav
язык формирует сознание
Anonymous
Есть у кого нибудь решебник Абрамяна
Viacheslav
Нет, мы ни у какого Абрамяна решебники не брали. Если интересует конкретное задание, с которым нужна помощь — иди в @supapro. Но писать решение за тебя и там не будут.
Viacheslav
Иначе непонятно, на кой хрен вообще связываться с программированием, если это неинтересно и не получается.
Andrei
язык формирует сознание
Виттгенштейн, плиз.
Alexander "SonnySlave"
ну это не у всех
Evgenii
ещё скажи, что ты работаешь не только ради ЗП
ну кста у меня больше половины курса ради зп пошли cs учить
Alexander "SonnySlave"
чтд.
Vsevolod
халявные обеды - зло
Alexander "SonnySlave"
Berkus
халявные обеды - зло
так говорят только те, у кого их нету
Vsevolod
у меня есть, точнее, были
Anonymous
Как стать программистом?
Vsevolod
и они были слишком хороши
Alexander "SonnySlave"
если в форме держать себя не получается - это другие вопросы
Vsevolod
+ 10кг за полгода
Vsevolod
и это при походах в качалку 4 раза в неделю
Berkus
Как стать программистом?
тебе - обратиться к Абрамяну
Anonymous
Как научиться в С++?
vladislav
Виттгенштейн, плиз.
Он разве говорил об этом?
Andrey
халявные обеды - зло
Это резерв конторы на случай кризиса.
Alexander "SonnySlave"
Как стать программистом?
спроси на нашем форуме: linux.org.ru/forum/development/
Berkus
Как научиться в С++?
никак, даже страуструп его не знает
Anatoly
Как стать программистом?
встань и иди программистом
vladislav
Как научиться в С++?
Полюбить, когда тебя не любят
Evgenii
это должен быть шаблонный ответ
Anonymous
Как?