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