What is C++20#39;s string literal operator template?(C++的字符串文字运算符模板是什么?)
问题描述
什么是C++20的字符串文字运算符模板?在这方面,CpPreferences的example相当简明,我不是很清楚:struct A { A(const char *); auto operator<=>(const A&) const = default; };
template<A a> A operator ""_a();
在尝试理解此功能时,我刚刚了解到在C++中可以使用数值文字运算符模板,它使数值常量的每一位都作为非类型参数传递给模板(参见。更好的解释here)。目前,文字运算符模板不能处理字符文字,尽管有支持这一功能的编译器扩展。我不认为C++20的字符串模板与此有任何关系,因为我了解到,扩展文本运算符模板以使用字符文字的提议在委员会中被否决了?
有两个独立的提案: 第一个提案被部分并入第二个提案。作为非类型模板参数,字符串文本仍然不是有效参数,但它们是类类型中的有效参数。[temp.arg.nontype]/4中的示例可能会有所帮助: 然而,第一个方案中扩展文字运算符的部分被合并到第二个方案[lex.ext]/5:推荐答案
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
如果S包含带有非类型模板参数的文字运算符模板,且字符串是格式良好的模板参数,则文字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,默认的<=>要求将更改为默认的==要求。
这篇关于C++的字符串文字运算符模板是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++的字符串文字运算符模板是什么?
基础教程推荐
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- CString 到 char* 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
