sconst, то это самый тривиальный случай — компилятор может просто начинать вычислять
Конечно может, у него есть такое право. А @iccsf утверждает, что это его обязанность.
А по какому критерию компилятор будет решать что ему вычислять, а что нет, если все sconst вычислимы? if rand() == 1?
вопрос в том, за какое время они вычислимы
Это на ответственности пользователя
Ну например по такому, или каждое пятое.
Хорошо, допустим. Почему компилятор должен каждую твою функцию компилировать в эквивалентное внутреннее представление, а не заменять каждую пятую на return 0?
На самом деле, я даже могу привести пример где это осмысленно: компилятор 1) доказал, что конст-выражение корректно. 2) опасается, что выражение потребует для вычисления более 10**18 единичных шагов 3) предполагает, что функция будет вызываться редко. Тогда он: 1) может при каждом запуске функции честно вычислять это выражение (это точно корректное поведение) 2) по идее, может завернуть в лейзи-статик (но я не на 100% уверен, что так можно) И сильно сэкономить на компиляции
Я предпочту чтобы компилятор вел себя предсказуемо, спасибо
Потому что тут есть конкретное as-if rule: есть программа на расте, есть абстрактная машина, есть набор поведений этой программв на этой машине. Поведение бинарника на реальной машине должно быть одним из поведений исходной программы на абстрактрой машине
Так и пишем в стандарт: "реализация должна вести себя предсказуемо по мнению mersinvald и mikailbag"?:)
Если функция помечена как sconst и все ее параметры помечены как sconst, результат тоже является sconst и обязан быть вычислен во время компиляции
Ну и если компилятор заменит тело функции на return 0, то (кроме вырожденных случаев типа в функции было UB или функция никогда не вызывалась) as-if rule сломается
То есть в оперативной памяти компилятора на миг должно появится значение выражения? Или в бинарнике? Или в бинарнике, но до применения к нему оптимизаций?
так это с++20 costeval, не?
не всё так просто
да, все со своим cost
нет, просто я не смог найти, чтобы там требовали от компилятора вычисления на этапе компиляции. Там как-то хитро сделано и вводится новые типы constant expression
ну его мохно в темплейт кинуть, во
А разве это заставит компилятор вычислить точное значение?
а мономорфизация же всегда в компайл-тайме
ссылку на стандарт можно?
а ♂hunded bucks♂ можно?
тогда откуда такое утверждение?
из опыта, тк я бедній щкольник
тут опыт не интересен. тут интересно формальное описание
а, ну тогда скажу за вышеупомянутую сумму
Обсуждают сегодня