在c ++ 0x中重写用户定义文字的规则

关于重载规则,我有点困惑, 假设有以下文字运算符,
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和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被视为表单的调用      operator“”X<'c1','c2',...'ck'>()      其中n是源字符序列c1c2 ... ck。 这表示,如果存在1(无符号长long参数),则13_xx应调用1,否则13_xx应调用2.并且从13.5.8开始,   特别是,它们被查找为普通函数和函数模板   并且它们遵循相同的重载决策规则。 根据我的理解,如果1不存在,则13_xx可以隐式转换为double并调用3。 因此,如果不存在1,则2& 3从标准描述中某种程度上是有效的。 我希望有人可以帮我清除疑虑。非常感谢。     
已邀请:
我相信13.5.8 / 7澄清了这个问题:   注意:文字运算符和文字   通常调用运算符模板   隐含地通过用户定义   文字(2.14.8)。但是,除了   他们说,上面描述的限制   是普通的命名空间范围函数   和功能模板。特别是,   他们像普通人一样抬头   功能和功能模板和   他们遵循相同的超载   解决规则。 根据我的理解,当通过用户定义的文字在隐式调用之外调用时,仅对文字运算符隐含常规重载解析规则。 所以我认为如果2&定义了3,
13_xx
调用2(原始文字运算符)。     

要回复问题请先登录注册