Что значит "вдруг" начнет возвращать не то? предлагаете рефакторинг в результате которого стало что-то типа такого:
bool ce = std::is_constant_evaluated();
if (ce) { ... } else { ... }
т.е. вынесли ce в отдельную переменную? В этом плане if consteval более эрогономичный. А если кто-то реализовал на основе него std::is_constant_evaluated то это на самом деле плохая идея, потому что ответ в кт и рт должен совпадать.
PS Новый редактор хабра вообще отбивает желание сюда писать :(
Я про `if consteval` из C++23. Т.е. вот автор предлагает делать две функции и перегрузку по constexpr модифиактору. Я спросил, чем эта перегрузка отличается от if consteval внутри одной функции. Например одно отличие, что можно было бы добавлять перегрузки отдельно. В любом случае constexpr уже заняли больше 10 лет назад для другой цели.
Да, ответ менять не надо - надо менять реализацию. Вам хочется поднять его на уровень типов, кажется что такая возможность только добавит непонятных моментов в коде. Тогда ваш рефакторинг а ля вынесли константу в новую переменную не просто поменяет true на false, а может поменять int на float.
Вполне закономерно. Вы везде пытались поменять ответ в зависимости от const_evaluated. А он предназначен для противоположной цели. И там вполне ясно сказано что тестируется выражение содержащие is_const_evaluated() а не функция в которой содержится эта инструкция. Пример с тренарником интереснее, но про него есть в документации.
Но если такой предел пробовать для всех функций, то это займет больше времени, чем только для constexpr. Хотя пропагирование констант работает и для обычных функций часто, без пометки constexpr.
Пробовать вычислить любую функцию в constexpr может быть проблематично, если ее вычисление занимает много времени, или вообще не известно завершима ли она. Что компиляторы должны делать в таком случае? И что они делают сейчас интересно.
Кажется это называется постмодернизм в философии. Когда предсказание о том какой студент будет хорош, влияет на восприятие его работ обществом. И если он хоть как-то нормально умеет рисовать (а красиво рисовать это отчасти вполне инженерного плана ремесло), то у него есть все шансы стать следущим Пикассо.
Не все примеры тривиальные. В том коде чуть по-другому ошибка появляется.
древнючий буст и весь легаси пример я конечно не хочу заводить, но `-fsanitize=address` обычно отлавливает висячие ссылки на локальные переменные.
что malloc и linux kernel не существует? =)
Написать линт для clang-tidy - что is_constant_evaluated только внутри if (...).
Сомневаюсь что механизм перегрузок в С++ проще (с точки зрения потенциальных ошибок) одного ифа.
Что значит "вдруг" начнет возвращать не то?
предлагаете рефакторинг в результате которого стало что-то типа такого:
т.е. вынесли
ceв отдельную переменную? В этом планеif constevalболее эрогономичный. А если кто-то реализовал на основе негоstd::is_constant_evaluatedто это на самом деле плохая идея, потому что ответ в кт и рт должен совпадать.PS Новый редактор хабра вообще отбивает желание сюда писать :(
Согласен. Писать два вида чисел, как предлает человек выше - это писать в два раза больше кода на каждый такой if и комбинаторный взрыв в результате.
Я про `if consteval` из C++23. Т.е. вот автор предлагает делать две функции и перегрузку по
constexprмодифиактору. Я спросил, чем эта перегрузка отличается отif constevalвнутри одной функции. Например одно отличие, что можно было бы добавлять перегрузки отдельно. В любом случае constexpr уже заняли больше 10 лет назад для другой цели.автор хотел как в js скорее всего
Очевидно почему так плохо - придется два варианта писать для всех constexpr функций которые ее используют.
Чем отличается от if consteval внутри тела функции?
Да, ответ менять не надо - надо менять реализацию. Вам хочется поднять его на уровень типов, кажется что такая возможность только добавит непонятных моментов в коде. Тогда ваш рефакторинг а ля вынесли константу в новую переменную не просто поменяет true на false, а может поменять int на float.
В hpp файлах часто темплейты, и их надо разбирать при инстанциировании с новыми темплейт аргументами, и следовательно компилировать заново.
Вполне закономерно. Вы везде пытались поменять ответ в зависимости от const_evaluated. А он предназначен для противоположной цели. И там вполне ясно сказано что тестируется выражение содержащие is_const_evaluated() а не функция в которой содержится эта инструкция. Пример с тренарником интереснее, но про него есть в документации.
на сppreference всё логично описано.
Т.е. он не делает разницы для constexpr и нет функций на этапе оптимизаций?
потому что
this->никогда не был обязательнымНо если такой предел пробовать для всех функций, то это займет больше времени, чем только для constexpr. Хотя пропагирование констант работает и для обычных функций часто, без пометки constexpr.
Пробовать вычислить любую функцию в constexpr может быть проблематично, если ее вычисление занимает много времени, или вообще не известно завершима ли она. Что компиляторы должны делать в таком случае? И что они делают сейчас интересно.
Кажется это называется постмодернизм в философии. Когда предсказание о том какой студент будет хорош, влияет на восприятие его работ обществом. И если он хоть как-то нормально умеет рисовать (а красиво рисовать это отчасти вполне инженерного плана ремесло), то у него есть все шансы стать следущим Пикассо.