Как видно из заголовка: возможно ли гарантировать, что функция constexpr вызывается максимум один раз во время компиляции?
Это явно не будет возможно, если функция не является constepxr; Я мог бы написать функцию, которая вызывается всякий раз, когда я нажимаю клавишу пробела, поэтому компилятор никогда не сможет понять это во время компиляции.
Короткий ответ: нет потому что constexpr
функции не могут читать / устанавливать внешнее состояние. (Они могут иметь внутреннее состояние, но все равно должны быть «чистыми»).
Реальный ответ: наверное да, но это плохая идея. Существует серия постов в блоге Филип Розен который охватывает реализацию Stateful constexpr
функции, злоупотребляя friend
корабль и ADL:
«НЕСТОЯННЫЕ КОНСТАНТ-ВЫРАЖЕНИЯ В С ++» — (кэшируется Google)
«КАК ОСУЩЕСТВЛЯТЬ КОНСТАНТНО-ВЫРАЖАТЕЛЬСКИЙ СЧЕТЧИК В C ++» — (кэшируется Google)
«КАК ОСУЩЕСТВЛЯТЬ МЕТАКОНТЕЙНЕР СКОРОГО ВРЕМЕНИ В C ++» — (кэшируется Google)
Техника очень загадочная и сложная. Это считается злоупотреблением функциями CWG, который пытается это сделать плохо формируется с проблемой № 2118.
Других решений пока нет …