Related: Функция, возвращающая 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
arguments.
Для примера, отличного от конструктора std::string
, я думаю, что довольно просто найти пример, где, если бы вы могли игнорировать требования constexpr
(и таким образом создать не- constexpr
функция), вы можете создать более эффективную функцию.Рассмотрим этот поток: вопрос constexpr, почему эти две разные программы работают с g ++ в такое разное время?
Если я вызываю fib
с аргументом constexpr
, яне может быть лучше, чем компилятор, полностью оптимизирующий вызов функции.Но если я вызову fib
с аргументом, отличным от constexpr
, я, возможно, захочу, чтобы он вызывал мою собственную версию, которая реализует такие вещи, как запоминание (что потребовало бы состояния), поэтому я получаю время выполнения, подобное тому, что было бы моей компиляциейраз я передал constexpr
аргумент.