Це має значення лише в тому випадку, якщо функція є частиною загальнодоступного інтерфейсу, і ви хочете зберегти майбутні версії API, бінарні сумісні. У такому випадку вам потрібно добре подумати, як ви хочете розвивати свій API і де вам потрібні точки розширення для подальших змін.
Це робить constexpr
класифікатор безповоротним дизайнерським рішенням. Ви не можете видалити цей класифікатор без несумісної зміни в API. Він також обмежує те, як ви можете реалізувати цю функцію, наприклад, ви не зможете робити жодного журналу в межах цієї функції. Не кожна тривіальна функція залишиться тривіальною у вічності.
Це означає, що бажано використовувати constexpr
для функцій, які по суті є чистими функціями, і це було б корисно під час компіляції (наприклад, для метапрограмування шаблонів). Було б непогано робити функції constexpr лише тому, що поточна реалізація, можливо, сумісна з contexpr.
Якщо оцінка часу компіляції не є необхідною, більш правильним буде здаватися використання вбудованих функцій або функцій із внутрішнім зв’язком constexpr
. Усі ці варіанти мають спільне те, що тіло функції є "загальнодоступним" та доступне в тому ж блоці компіляції, що і місце розташування виклику.
Якщо функція, про яку йдеться, не входить у стабільний, публічний API, це менше проблеми, оскільки ви можете довільно змінювати дизайн за бажанням. Але оскільки ви зараз контролюєте всі сайти викликів, не потрібно позначати функцію constexpr "про всяк випадок". Ви знаєте, чи використовуєте ви цю функцію в контексті constexpr. Додавання зайвих обмежувальних класифікаторів може вважатися затемненням.