据我了解,这两个签名没有区别。
问题是标识符_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;
}
用户定义文字背后的想法是允许创建一个可应用于内置类型的运算符,该类型可以将内置文字转换为另一种类型。
编辑:
要调用这些运算符之一,您只需将运算符作为后缀附加到值文字。所以给出:
// 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 "" _π();
Maybe 看看这个。