37

考虑:

struct str {};

str operator"" _X(long double d) {
    return str();
}

这与 g++ 4.7.2 Wall std=c++11 编译得很好

但现在如果我给一个 double :

str operator"" _X(double d) {
    return str();
}

我收到以下错误消息: main.cpp|3|error: 'str operator"" _X(double)' has invalid argument list

问题是什么 ?这与“无法重新定义内置文字后缀的含义”(Stroustrup FAQ)有关吗?你能想出一个解决方法吗?

4

2 回答 2

51

问题是什么?

问题是标准禁止它。根据 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

关于解决方法,我不确定它是否需要,因为以下工作正常( adouble被隐式转换为 a long double,因此您可以传入 type 的文字double):

struct str {};

str operator"" _X(long double d) {
    return str();
}

int main()
{
    str s = 4.0_X;
}
于 2013-05-16T20:30:28.013 回答
8

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

str operator"" _X(long double ld);
str operator"" _X(double d);
str operator"" _X(float f);

您能否在源代码中给出用户定义文字的示例,这些文字将映射到上述每一个?不,没有办法将文字限制为特定的浮点数据类型。

这一套可能有用:

str operator"" l_X(long double ld);
str operator""  _X(long double d);
str operator"" f_X(long double f);

从现在开始你可以写

3.0_X  // treated like a double
3.0l_X // treated like a long double
3.0f_X // treated like a float
于 2013-05-16T20:45:00.393 回答