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

时间:2019-01-20 15:54:37

标签: c++ c++20 user-defined-literals

C ++ 20的字符串文字运算符模板是什么?在这方面,Cppreference的example十分简洁,对我来说也不是很清楚:

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

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

在试图了解此功能的含义时,我刚刚了解到您可以在C ++中具有数字文字运算符模板,该模板使数字常数的每一位都作为非类型参数传递给模板(请参见更好的说明here)。当前,文字运算符模板不适用于字符文字,尽管有编译器扩展支持该功能。我认为C ++ 20的 string 文字运算符模板与之无关,因为我了解到扩展文字的建议负责人投票否决了用于字符文字的操作员模板?

1 个答案:

答案 0 :(得分:19)

有两个单独的提案:

  • 允许将字符串文字用作非类型模板参数(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更改为默认的==要求。