C ++ 20 вводит типы классов в параметрах шаблона, не являющегося типом . Как упоминалось в предложении, одной из мотиваций были строки времени компиляции, и это позволяет делать это :
template < size_t size >
struct Literal : std::array<char,size>
{
constexpr Literal(char const (&str)[size+1]) { for (size_t ii = 0; ii < size; ++ii) (*this)[ii] = str[ii]; }
};
template < size_t size > Literal(char const (&str)[size]) -> Literal<size-1>;
template < Literal literal > constexpr auto operator "" _lit() { return literal; }
template < Literal > struct Use { };
Use<"foo"_lit> use;
В предложении также говорится:
Было несколько предложений [N3599] [P0424R0] по ослаблению запрета на строковые пользовательские литералы, которые принимают свою необработанную форму в качестве отдельных аргументов шаблона char, и пока все эти предложения не получили консенсуса.
Основная проблема, которая возникает в ответ на такие предложения, заключается в том, что обработка строк как пакетов аргументов шаблона char является чрезвычайно затратной с точки зрения использования ЦП компилятора и памяти, а разрешение таких UDL приведет к очень большим пакетам значений char. гораздо более распространены, чем сегодня. Это, в свою очередь, может привести к тому, что поставщики компиляторов заставят свои продукты хорошо работать при таких рабочих нагрузках обработки строк во время компиляции, что затруднительно из-за того, что строки представлены с использованием синтаксиса и механизма, которые никогда не предназначались для поддержки таких вариантов использования.
Таким образом, хотя это не упоминается напрямую, я предполагаю, что это предложение было разработано, чтобы избежать чрезвычайно дорогостоящего использования процессора и памяти компиляторами при работе со строками времени компиляции. Возможно, это станет возможным из-за подхода к искажению и использования оператора трехстороннего сравнения , упомянутого в первом разделе предложения. Верно ли это предположение?
gcc-9.3
не поддерживает оператор трехстороннего сравнения , но поддерживает типы классов в параметрах шаблона без типов . Однако наличие строк времени компиляции вышеупомянутым способом с gcc-9.3
на самом деле, кажется, приводит к чрезвычайно дорогостоящему использованию ЦП и памяти .
Есть ли подходящий флаг для gcc-9
или gcc-10
, что будет настраивать компилятор под такой код?