我对重载规则有点困惑,
假设有以下文字运算符,
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 <'c1', 'c2', ... 'ck'>()
其中 n 是源字符序列 c1c2...ck。
这表示,如果存在 1(无符号长长参数),13_xx 将调用 1,否则,13_xx 将调用 2。从 13.5.8 开始,
特别是,它们像普通函数和函数模板一样被查找,并且遵循相同的重载决议规则。
据我了解,如果 1 不存在,则 13_xx 可以隐式转换为 double 并调用 3。
因此,如果 1 不存在,则 2 和 3 在标准描述中都是有效的。
我希望有人可以帮助我消除我的疑惑。非常感谢。