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

时间:2010-12-08 07:59:01

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

我对重载规则感到有些困惑,

假设有以下文字运算符,

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视为对表单的调用

     

operator“”X(n ULL)

     

否则,S应包含原始文字运算符或文字运算符模板(13.5.8),但不能同时包含两者。如果S包含原始文字运算符,则将文字L视为表单

的调用      

operator“”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从标准描述中某种程度上是有效的。

我希望有人可以帮我解决疑惑。非常感谢。

1 个答案:

答案 0 :(得分:4)

我认为13.5.8 / 7澄清了这个问题:

  

注意:文字运算符和文字   通常调用运算符模板   隐含地通过用户定义   文字(2.14.8)。但是,除外   他们说,上面描述的限制   是普通的命名空间范围函数   和功能模板。特别是,   他们像普通人一样抬头   功能和功能模板和   他们遵循相同的超载   决议规则。

根据我的理解,当通过用户定义的文字调用 outside 进行隐式调用时,常规重载解析规则仅适用于文字运算符。

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