перегрузка 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
аргумент.