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
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?
если переменная condition известна в compile time, то в рантайме условие проверки (GSL_UNLIKELY(!(condition))) выбрасывается если GSL_UNLIKELY вычислимо во время компиляции.
при false вызывается noop() - возможно он constexpr
Anatoly
Илья
при false GSL_UNLIKELY(!(condition)) функция полностью constexpr, если параметры вычислимы на этапе компиляции
Anatoly
Илья
validate(true, ...) => fail(...) в рантайме
Anatoly
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 то она преобразуется в машинный код компилятором и вызовется во время выполнения
Anatoly
Pavel
Inspector – A drop-anywhere C++ REPL (Score: 103+)
Link: http://j.mp/2G57Jq3
Comments: http://j.mp/2ECG2rC
Berkus
на клинге сделано
Anatoly
Anatoly
То есть, MSVC 2015 ошибается, ломаясь на этом коде.
Anatoly
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 известен во время компиляции
Илья
Igor
ок, теперь понял, спасибо)
Max
кто-нибудь, обьясните, как этот синтаксис работает под капотом
template<typename... Args>
void readln(Args&... args)
{
((cin >> args), ...);
}
Berkus
Anatoly
vladislav
решебник?) лол
vladislav
мне бы решебник тасок в jira
Arseny
Может нужен бот, который всех вступающих будет в @supapro отправлять? Он, конечно, будет ошибаться, но очень редко.
Berkus
на 2500 участников просто включим автобанилку
Berkus
vladislav
будут в @supapro сидеть
Egor
Cтрауструп в супапро как раз будет молодёжь учить
vladislav
темплейты
Viacheslav
Какие вы жестокие.
vladislav
язык формирует сознание
Anonymous
Есть у кого нибудь решебник Абрамяна
Viacheslav
Нет, мы ни у какого Абрамяна решебники не брали. Если интересует конкретное задание, с которым нужна помощь — иди в @supapro. Но писать решение за тебя и там не будут.
Viacheslav
Иначе непонятно, на кой хрен вообще связываться с программированием, если это неинтересно и не получается.
Berkus
Andrei
Alexander "SonnySlave"
Berkus
Alexander "SonnySlave"
ну это не у всех
Alexander "SonnySlave"
Berkus
Alexander "SonnySlave"
чтд.
Vsevolod
халявные обеды - зло
Alexander "SonnySlave"
Vsevolod
у меня есть, точнее, были
Anonymous
Как стать программистом?
Vsevolod
и они были слишком хороши
Alexander "SonnySlave"
если в форме держать себя не получается - это другие вопросы
Vsevolod
+ 10кг за полгода
Vsevolod
и это при походах в качалку 4 раза в неделю
Anonymous
Как научиться в С++?
Evgenii
Evgenii
это должен быть шаблонный ответ
Anonymous
Как?