Можно ли гарантировать, что функция constexpr вызывается не более одного раза во время компиляции?

Как видно из заголовка: возможно ли гарантировать, что функция constexpr вызывается максимум один раз во время компиляции?

Это явно не будет возможно, если функция не является constepxr; Я мог бы написать функцию, которая вызывается всякий раз, когда я нажимаю клавишу пробела, поэтому компилятор никогда не сможет понять это во время компиляции.

4

Решение

Короткий ответ: нет потому что constexpr функции не могут читать / устанавливать внешнее состояние. (Они могут иметь внутреннее состояние, но все равно должны быть «чистыми»).


Реальный ответ: наверное да, но это плохая идея. Существует серия постов в блоге Филип Розен который охватывает реализацию Stateful constexpr функции, злоупотребляя friendкорабль и ADL:

Техника очень загадочная и сложная. Это считается злоупотреблением функциями CWG, который пытается это сделать плохо формируется с проблемой № 2118.

13

Другие решения

Других решений пока нет …