【问题标题】:Overloading rules for User-defined-literals in c++0xc++0x中用户定义文字的重载规则
【发布时间】:2011-05-22 01:57:03
【问题描述】:

我对重载规则有点困惑,

假设有以下文字运算符,

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(无符号长长参数),13_xx 将调用 1,否则,13_xx 将调用 2。从 13.5.8 开始,

特别是,它们像普通函数和函数模板一样被查找 并且它们遵循相同的重载解析规则。

据我了解,如果 1 不存在,13_xx 可以隐式转换为 double 并调用 3。

因此,如果 1 不存在,则 2 和 3 在标准描述中都是有效的。

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

【问题讨论】:

    标签: c++ c++11 user-defined-literals


    【解决方案1】:

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

    注意:字面运算符和字面量 运算符模板通常被调用 通过用户定义的隐式 文字(2.14.8)。但是,除了 上述约束,他们 是普通的命名空间范围函数 和功能模板。特别是, 他们像普通人一样被仰望 函数和函数模板以及 他们遵循相同的重载 解析规则。

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

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

    【讨论】:

    • 谢谢。因此,对于用户定义的文字,这些文字运算符函数的隐式调用将不使用任何 int-to-float,以及 char-to-int 和 char-to-float 类型转换。只有显式调用这些函数才会尝试应用重载决议。这对我来说很有意义。
    • 当然可以。短语“它们像普通函数和函数模板一样查找,它们遵循相同的重载解析规则。”说的就是它所说的。它没有说明提问者得出的结论。它也可以完全删除。这是非规范性文本。 2.14.8/3 的规则很明确——它们不会被重载决议以某种方式破坏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多