我对超载规则有点困惑,
假设有以下文字运算符,
unsigned long long operator "" _xx(unsigned long long cooked_literal_int); //1
unsigned long long operator "" _xx(const char * raw_literal_string); // 2
unsigned long long operator "" _xx(long double cooked_literal_double); // 3
如果同时定义了 1、2 和 3,则重载是显而易见的,
13_xx //call 1
13.5_xx //call 3
如果定义了 1 和 2,
13_xx //call 1
13.5_xx //call 2
如果定义了 2 和 3
13_xx // call 2 or 3??
13.5_xx // call 3
混乱来自最新的 c++0x 标准 n3225 2.14.8/3,
如果 L 是用户定义的整数文字,则令 n 为不带 ud 后缀的文字。如果 S 包含参数类型为 unsigned long long 的文字运算符,则文字 L 被视为以下形式的调用
运算符 "" X (n ULL)
否则,S 应包含原始文字运算符或文字运算符模板 (13.5.8),但不能同时包含两者。如果 S 包含原始文字运算符,则文字 L 被视为以下形式的调用
运算符“”X(“n”)
否则(S 包含文字运算符模板),L 被视为以下形式的调用
运算符 "" X ()
其中 n 是源字符序列 c1c2...ck。
这表示,如果存在 1(无符号 long long 参数),则 13_xx 应调用 1,否则,13_xx 应调用 2。从 13.5.8 开始,
特别是,它们像普通函数和函数模板一样查找
并且它们遵循相同的重载解析规则。
根据我的理解,如果 1 不存在,13_xx 可以隐式转换为 double 并调用 3。
因此,如果 1 不存在,则根据标准描述,2 和 3 在某种程度上都是有效的。
我希望有人能帮我解答我的疑惑。非常感谢。