Re[9]: constexpr - разочарование
От: Дрободан Фрилич СССР  
Дата: 14.06.17 16:15
Оценка:
N. I.:

NI>Если определение функции доступно в каждой единице трансляции, где её вызывают (что типично для шаблонных и inline функций), то ничто не мешает компилятору попробовать вычислить её на этапе компиляции независимо от того, есть у неё спецификатор constexpr или нет. Наличие у функции спецификатора constexpr может лишь дать оптимизатору подсказку, что вероятность существования возможности посчитать её в compile time выше, чем в случае с "обычными" функциями, при этом в общем случае constexpr не даёт гарантий, что функцию можно посчитать в compile time при вызове её с любыми аргументами, значения которых известны на этапе компиляции.


Тут может быть скрываться проблема совместимости. Компилятор A даёт послабления и съест исходник, а компилятор B выплюнет. Или даже две версии одного компилятора.
Программист, понадеявшийся на нестандартную фичу создаст крайне непортабельный код, который фиг откомпилируешь.

Конкретный пример, один компилятор проверяет все ветки на соответствие constexpr-у, а другой только те что вычисляются.
На хабре был пример https://habrahabr.ru/post/228181/ , бросать исключение в дохлых ветках констекспра формальное не запрещалось. Такой финт ушами использовался для совместимости compile-time и run-time по ошибкам.
Оказалось не все компиляторв такое могут.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.