Что такое шаблон строкового литерала C ++ 20? - PullRequest
0 голосов
/ 20 января 2019

Что такое шаблон строкового литерала C ++ 20? Пример от Cppreference в этом отношении довольно лаконичен и не очень понятен для меня:

struct A { A(const char *); auto operator<=>(const A&) const = default; };

template<A a> A operator ""_a(); 

Пытаясь понять, что это за функция, я только что узнал, что вы можете иметь шаблонов числовых литеральных операторов в C ++, которые позволяют передавать каждую цифру числовой константы в качестве нетипового аргумента шаблон (см. лучшее объяснение здесь ). В настоящее время шаблоны литеральных операторов не работают с символьными литералами, хотя существуют расширения компиляторов, позволяющие это сделать. Я не думаю, что C ++ 20 string шаблоны литеральных операторов как-то связаны с этим, так как я узнал, что были предложены предложения по расширению шаблонов литеральных операторов для работы с символьными литералами в комитете?

1 Ответ

0 голосов
/ 20 января 2019

Было два отдельных предложения:

  • Разрешение строковых литералов в качестве нетиповых параметров шаблона ( P0424 )
  • Разрешение типов классов в качестве нетиповых параметров шаблона ( P0732 )

Первое предложение было частично объединено со вторым. Строковые литералы по-прежнему не являются допустимыми аргументами в качестве нетиповых параметров шаблона, но они являются допустимыми аргументами для типов классов. Пример из [temp.arg.nontype] / 4 может помочь:

template<class T, T p> class X {
  /* ... */
};

X<const char*, "Studebaker"> x; // error: string literal as template-argument

const char p[] = "Vivisectionist";
X<const char*, p> y;            // OK

struct A {
  constexpr A(const char*) {}
  friend auto operator<=>(const A&, const A&) = default;
};

X<A, "Pyrophoricity"> z;        // OK, string literal is a constructor argument to A

Однако часть первого предложения, которая расширила буквальные операторы, была тем, что было объединено со вторым, [lex.ext] / 5 :

Если S содержит шаблон литерального оператора с нетиповым параметром шаблона, для которого str является правильно сформированным аргументом шаблона, литерал L обрабатывается как вызов формы operator "" X<str>()

Итак, используя это:

struct A { A(const char *); auto operator<=>(const A&) const = default; };     
template<A a> A operator ""_a() { return a; }

Мы можем написать "Hello"_a, что будет интерпретироваться как вызов operator "" _a<A("Hello")>.

<час />

Обратите внимание, что эти правила немного изменяются, поскольку требование по умолчанию <=> изменится на требование по умолчанию == согласно P1185 .

...