HM098 重载陷阱

HM098 重载陷阱

HM098 重载陷阱

来源: 第 98 集 函数高级-函数重载-注意事项

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

函数重载有两处容易踩空。

第一处:引用可以当作重载条件。void func(int &value)void func(const int &value) 的形参类型不同,允许共存。

  • 传入一个普通变量时,变量可读可写,会走进没有 const 的版本。
  • 传入字面量(例如 \(10\))时,没有 const 的引用不能绑字面量(引用必须绑合法内存);加上 const 后编译器会生成临时量,因此只能走进常量引用版。这两种调用不会打架。

第二处:重载再叠默认参数容易二义。例如同时存在

  • void func2(int a, int b = 10)
  • void func2(int a)

两份函数本身可以写在一起(语法能过)。但只传一个整数时,上一份用默认实参也能接,下一份本身就是一参,编译器不知道走哪一份。传两个整数则只匹配第一份,没有歧义。写重载时不要再给默认参数。

处理 \(q\) 次询问:

  • V x:把变量 \(x\) 传给 func,应走可读可写版,输出 RW x
  • L x:把字面量 \(x\) 传给 func,应走常量引用版,输出 RO x
  • A x:在上述两份 func2 都存在时只传一个 \(x\),输出 AMBIGUOUS
  • P x y:传两个整数给两参版本,输出 PAIR x y

输入格式

第一行一个整数 \(q\)(\(1 \le q \le 1000\))。

接下来 \(q\) 行,格式见上。所有整数的绝对值不超过 \(10^9\)。

输出格式

每行一次结果,行末换行。

样例

输入 #1

5
V 10
L 10
A 10
P 10 20
V 7

输出 #1

RW 10
RO 10
AMBIGUOUS
PAIR 10 20
RW 7

输入 #2

2
L -3
P 1 1

输出 #2

RO -3
PAIR 1 1

说明

  • int &const int & 属于类型不同,可以重载。
  • 变量走非 const 引用;字面量只能绑常量引用。
  • 重载加上默认参数后,单实参调用可能两份都能匹配,必须避免。
  • 两实参调用只匹配两参版本,没有二义。

信息

ID
1097
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者