C++ 用户定义的文字定义
我在看文字,我想除了几个例子,我什么都懂C++ 用户定义的文字定义,c++,c++11,user-defined-literals,C++,C++11,User Defined Literals,我在看文字,我想除了几个例子,我什么都懂 template <char...> double operator "" _π(); // OK 以上两种功能的区别是什么?如果第一个函数不是错误,那么调用第一个函数与调用第二个函数有什么区别 谢谢 据我所知,这两个符号没有区别 问题在于,该标准在技术上保留了标识符\u Z。主要区别在于有一个空间: double operator""/*space*/_Z(long double); double operator""_Z(long
template <char...> double operator "" _π(); // OK
以上两种功能的区别是什么?如果第一个函数不是错误,那么调用第一个函数与调用第二个函数有什么区别
谢谢 据我所知,这两个符号没有区别 问题在于,该标准在技术上保留了标识符
\u Z
。主要区别在于有一个空间:
double operator""/*space*/_Z(long double);
double operator""_Z(long double);
删除空间基本上是一种解决方法,理论上可以抑制错误(或者更可能是警告)
至于如何使用它们,您是否查看了所列链接中的示例
#include <iostream>
// used as conversion
constexpr long double operator"" _deg ( long double deg )
{
return deg*3.141592/180;
}
// used with custom type
struct mytype
{
mytype ( unsigned long long m):m(m){}
unsigned long long m;
};
mytype operator"" _mytype ( unsigned long long n )
{
return mytype(n);
}
// used for side-effects
void operator"" _print ( const char* str )
{
std::cout << str;
}
int main(){
double x = 90.0_deg;
std::cout << std::fixed << x << '\n';
mytype y = 123_mytype;
std::cout << y.m << '\n';
0x123ABC_print;
}
调用代码可以是,例如:
long double d = 45_deg;
至于使用模板双运算符“π()代码>也许可以看看
以上两种功能的区别是什么
C++标准定义语法的令牌,你可以把它解释成单词。code>“\u Z
是两个令牌,”
和\u Z
<代码>“\u Z是单个令牌
这种区别很重要:给定#定义S“world!”
,然后定义“Hello”S
,空格使S
成为独立的标记,防止它被视为用户定义的文字后缀
为了便于编码,定义这些函数时通常允许使用
“\u Z
和”\u Z
语法,但“\u Z
语法要求将\u Z
视为标识符。当实现将\u Z
预定义为宏,或将其声明为自定义关键字时,这可能会导致问题。我确实查看了链接中的示例,但我不理解这两个\u Z
运算符的区别,如果\u Z
未保留,您将如何调用它?这也是用户定义的文本吗?额外的空间意味着什么?另外,\uuπ
部分没有回答。对不起,我想我的问题不清楚。我想问的是关于这两个\uz
事物之间的区别,空间到底意味着什么?我知道在通常情况下如何呼叫接线员,但空格是什么意思?这总是一个错误吗?@好奇-如果你读得足够近,它会解释说“\uz
(没有空格)是可以的,即使\uz
是保留的。它还表明,更具争议的复杂的文字“if
(同样没有空格)必须起作用,即使if
是一个关键字。“基本上:操作符”“\u Z&&operator”“\u Z是两个不同的标识符,后者是保留的。”--哈?不,这是完全错误的。运算符“”和运算符“”如果有效,将是完全相同的函数。您可以自己尝试使用运算符“”(U deg):添加运算符“”(U deg),然后查看是否出现重新定义错误。运算符“”的问题在于,由于Z是为实现使用而保留的,因此实现可以将其定义为可扩展到任何内容的宏。运算符“”避免了该问题,因为“”不是单独的令牌,它是“”令牌的一部分。\uzπ(char…c)
和双d='c'\uzπ代码>--抱歉,这显然只是猜测,而你猜得很糟。你知道为什么在\uπ
文本中,像这样的“某物”\uπ
不调用操作符“\uπ()
?我如何更改该用户定义文字的声明以使这些字符作为模板参数传递?@奇怪的是,这是不可能的,将单个字符作为模板参数传递只能使用数字文字。知道为什么吗?我不明白为什么不支持字符。@奇怪的是,我猜这仅仅是因为对于数字文字,在模板形式有帮助的地方找到了具体的例子,而对于字符串和字符文字,情况并非如此。看起来你不得不另辟蹊径,不支持常规的字符串文字。。有没有其他方法可以做到这一点?
// used as conversion
constexpr long double operator"" _deg ( long double deg )
{
return deg*3.141592/180;
}
long double d = 45_deg;
template <char...> double operator "" _π(); // OK
double operator"" _Z(long double); // error: all names that begin with underscore
// followed by uppercase letter are reserved
double operator""_Z(long double); // OK: even though _Z is reserved ""_Z is allowed