C++20 的字符串文字运算符模板是什么?

What is C++20's string literal operator template?

C++20 的字符串文字运算符模板是什么? cppreference的example这方面说的比较简洁,我不是很清楚:

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

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

在尝试了解此功能的过程中,我刚刚了解到您可以在 C++ 中使用 数字文字运算符模板,这使得数字常量的每一位都作为模板的非类型参数(参见更好的解释 )。目前,文字运算符模板不适用于字符文字,尽管有编译器扩展支持。我不认为 C++20 的 string 文字运算符模板 与此有任何关系,因为我了解到扩展文字运算符的建议使用字符文字的模板在委员会中被否决了?

有两个单独的提案:

  • 允许字符串文字作为非类型模板参数(P0424)
  • 允许 class 类型作为非类型模板参数 (P0732)

第一个提案已部分合并到第二个提案中。字符串文字仍然不是作为非类型模板参数的有效参数,但它们是 class 类型的有效参数。来自 [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:

If S contains a literal operator template with a non-type template parameter for which str is a well-formed template-argument, the literal L is treated as a call of the form 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.

更改为默认的 == 要求