перегрузка constexpr

Связанный:Функция, возвращающая constexpr, не компилируется

Мне кажется, что constexpr ограничен в полезности в C ++ 11 из-за невозможности определить две функции, которые в противном случае имели бы одну и ту же сигнатуру, но одна из которых была бы constexpr, а другая - не constexpr. Другими словами, было бы очень полезно, если бы у меня мог быть, например, конструктор constexpr std :: string, который принимает только аргументы constexpr, и конструктор non-constexpr std :: string для аргументов не constexpr. Другим примером может быть теоретически сложная функция, которую можно сделать более эффективной с помощью состояния. Вы не можете легко сделать это с помощью функции constexpr, поэтому у вас остается два варианта: иметь функцию constexpr, которая работает очень медленно, если вы передаете аргументы не-constexpr, или полностью отказываетесь от constexpr (или пишете две отдельные функции, но вы можете не знать, какую версию позвонить).

Поэтому мой вопрос таков:

Возможно ли для совместимой со стандартом реализации C ++ 11 разрешить перегрузку функций на основе аргументов constexpr, или это потребует обновления стандарта? Если это не разрешено, было ли это намеренно запрещено?

@NicolBolas: скажем, у меня есть функция, которая отображаетenum кstd::string, Самый простой способ сделать это, предполагая, что мойenum идет от0 вn - 1это создать массив размераn заполнен результатом.

Я мог бы создатьstatic constexpr char const * [] и построитьstd::string по возвращении (оплачивая стоимость созданияstd::string объект каждый раз, когда я вызываю функцию), или я могу создатьstatic std::string const [] и вернуть значение, которое я смотрю, оплатив стоимость всехstd::string Конструкторы в первый раз я вызываю функцию. Похоже, что лучшим решением было бы создатьstd::string в памяти во время компиляции (аналогично тому, что делается сейчас сchar const *), но единственный способ сделать это - предупредить конструктор о том, что он имеетconstexpr аргументы.

Для примера, отличного отstd::string конструктор, я думаю, довольно просто найти пример, где, если бы вы могли игнорировать требованияconstexpr (и, таким образом, создать неconstexpr функция), вы можете создать более эффективную функцию. Рассмотрим эту тему:Вопрос от constexpr, почему эти две разные программы работают с g ++ в такое разное время?

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

Ответы на вопрос(7)

Ваш ответ на вопрос