Bér*_*ger 29 c++ literals c++11
考虑:
struct str {};
str operator"" _X(long double d) {
return str();
}
Run Code Online (Sandbox Code Playgroud)
用g ++ 4.7.2 Wall std = c ++ 11编译好
但现在如果我给双倍:
str operator"" _X(double d) {
return str();
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:main.cpp | 3 | error:'str operator""_ X(double)'具有无效的参数列表
问题是什么 ?这与"不可能重新定义内置文字后缀的含义"(Stroustrup FAQ)有关吗?你能想到一个解决方法吗?
And*_*owl 40
问题是什么?
问题是标准禁止它.根据用户定义文字的C++ 11标准的第13.5.8./3段:
文字运算符的声明应具有等效于以下之一的参数声明子句:
Run Code Online (Sandbox Code Playgroud)const char* unsigned long long int long double char wchar_t char16_t char32_t const char*, std::size_t const wchar_t*, std::size_t const char16_t*, std::size_t const char32_t*, std::size_t
关于一个变通方法,我不确定它是否需要,因为以下工作正常(一个double隐式转换为a long double,所以你可以传入类型的文字double):
struct str {};
str operator"" _X(long double d) {
return str();
}
int main()
{
str s = 4.0_X;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是为了防止模棱两可的重载。如果允许您定义以下重载集会怎样
str operator"" _X(long double ld);
str operator"" _X(double d);
str operator"" _X(float f);
Run Code Online (Sandbox Code Playgroud)
你能给出源代码中用户定义文字的例子来映射到上面的每一个吗?不,没有办法将文字限制为特定的浮点数据类型。
可能有用的是这个集合:
str operator"" l_X(long double ld);
str operator"" _X(long double d);
str operator"" f_X(long double f);
Run Code Online (Sandbox Code Playgroud)
从现在起你可以写
3.0_X // treated like a double
3.0l_X // treated like a long double
3.0f_X // treated like a float
Run Code Online (Sandbox Code Playgroud)