我对重载规则感到有些困惑,
假设有以下文字运算符,
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从标准描述中某种程度上是有效的。
我希望有人可以帮我解决疑惑。非常感谢。
答案 0 :(得分:4)
我认为13.5.8 / 7澄清了这个问题:
注意:文字运算符和文字 通常调用运算符模板 隐含地通过用户定义 文字(2.14.8)。但是,除外 他们说,上面描述的限制 是普通的命名空间范围函数 和功能模板。特别是, 他们像普通人一样抬头 功能和功能模板和 他们遵循相同的超载 决议规则。
根据我的理解,当通过用户定义的文字调用 outside 进行隐式调用时,常规重载解析规则仅适用于文字运算符。
所以我认为如果2&定义了3个,13_xx
调用2(原始文字运算符)。