在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从标准描述中某种程度上是有效的。
我希望有人可以帮我清除疑虑。非常感谢。
没有找到相关结果
已邀请:
1 个回复
骨酚柯
调用2(原始文字运算符)。