2

我对重载规则有点困惑,

假设有以下文字运算符,

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 在标准描述中都是有效的。

我希望有人可以帮助我消除我的疑惑。非常感谢。

4

1 回答 1

4

我相信 13.5.8/7 澄清了这个问题:

注意:文字运算符和文字运算符模板通常通过用户定义的文字 (2.14.8) 隐式调用。但是,除了上面描述的约束之外,它们都是普通的命名空间范围的函数和函数模板。特别是,它们像普通函数和函数模板一样被查找,并且遵循相同的重载决议规则。

据我了解,常规重载解析规则仅在通过用户定义的文字在隐式调用之外调用时才对文字运算符隐含。

所以我认为如果 2 & 3 被定义,13_xx调用 2 (原始文字运算符)。

于 2010-12-08T09:07:58.997 回答