带有双参数的C++ 11运算符""

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段:

文字运算符的声明应具有等效于以下之一的参数声明子句:

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
Run Code Online (Sandbox Code Playgroud)

关于一个变通方法,我不确定它是否需要,因为以下工作正常(一个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)

  • @BérengerBerthoul:当'long double`具有更大或更大的范围和精度时,为什么要使用`double`?可能出于速度或内存使用原因,对吗?那么,这些不是在编译时完成的操作的考虑因素.如果要以双精度执行操作,则始终可以在函数内部使用强制转换. (6认同)
  • 好,谢谢.但为什么 ?我的意思是,语法中有什么东西阻止无法加倍吗? (3认同)
  • 如果13.5.8/8节不包含`double operator""_ Bq(double);`作为有效运算符的一个例子,那么标准会很多_less_混乱... (2认同)

Ben*_*igt 7

我认为这是为了防止模棱两可的重载。如果允许您定义以下重载集会怎样

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)