面试题答案
一键面试在C++中,当存在函数重载且参数为引用传递时,引用绑定规则会显著影响函数匹配。以下是通过代码示例来说明引用的类型(左值引用、右值引用)以及常量性对函数重载匹配的作用机制。
#include <iostream>
// 函数重载示例:左值引用参数
void func(int& param) {
std::cout << "func(int&): 左值引用参数" << std::endl;
}
// 函数重载示例:常量左值引用参数
void func(const int& param) {
std::cout << "func(const int&): 常量左值引用参数" << std::endl;
}
// 函数重载示例:右值引用参数
void func(int&& param) {
std::cout << "func(int&&): 右值引用参数" << std::endl;
}
int main() {
int a = 10;
const int b = 20;
// 调用左值引用版本
func(a);
// 调用常量左值引用版本
func(b);
// 调用右值引用版本
func(30);
return 0;
}
-
左值引用: 左值引用只能绑定到左值(例如变量)。在上述代码中,
func(int& param)
只能接受可修改的左值作为参数。所以func(a)
会调用这个版本,因为a
是一个可修改的左值。 -
常量左值引用: 常量左值引用可以绑定到左值(包括常量左值和非常量左值)。
func(const int& param)
可以接受常量左值(如b
)或非常量左值(如a
)。当有func(b)
调用时,由于b
是常量左值,所以会调用这个版本。如果没有func(const int& param)
这个重载,func(b)
将会调用func(int& param)
,但因为b
是常量,所以会导致编译错误。 -
右值引用: 右值引用只能绑定到右值(例如临时对象,像
30
)。func(int&& param)
专门用于处理右值,所以func(30)
会调用这个版本。
通过这种方式,引用的类型(左值引用、右值引用)以及常量性在函数重载匹配中起到了区分不同函数版本的关键作用。