2017-01-30 2 views
3

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

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

+2

выражения или функции constexpr не имеют побочных эффектов, поэтому не имеет значения, как часто они вызываются (за исключением времени исполнения/производительности). Итак, почему вы хотите убедиться, что constexpr оценивается только один раз? –

+0

@WernerHenze «Итак, почему вы хотите убедиться, что constexpr оценивается только один раз?» просто любопытство и найти границы языка :-) – rwols

+0

@rwols: Проблема в том, что «вызов только один раз» представляет собой бессмысленное понятие для функции 'constexpr' во время компиляции. Его можно буквально называть полтора раза (!) - реализация может кэшировать оценку выражений constexpr, и это может включать частичное кэширование. – MSalters

ответ

10

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


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

Техника очень загадочная и сложная. Это считается злоупотреблением функциями CWG, which is trying to make it ill-formed with issue #2118.

+2

Эти три статьи хорошо читаются , так что +1 от меня! Вы, вероятно, правы, что никто никогда не должен использовать эти методы. – rwols

+0

Ссылки (VERY SHOUTY) мертвы –

+0

@underscore_d: thanks, hopefully, они скоро вернутся. Добавлена ​​ссылка кэша Google –

Смежные вопросы