如何让C++函数中按引用传递的数组支持可选传递?
给按引用传递的数组设置默认值的可行方案
当然可以实现,但不能用nullptr作为默认值——因为C++里引用必须绑定到有效的对象,不能是空的,而且nullptr的类型和数组引用完全不匹配。
针对你的需求(不用std::array、保留数组大小信息、支持默认参数),最简单的方案是定义一个静态的默认数组,把它作为默认参数绑定到数组引用上:
// 定义一个静态的默认数组,生命周期贯穿整个程序 static int default_foo_arr[3] = {0}; void foo(int (&arr)[3] = default_foo_arr) { // 这里可以正常使用arr,比如获取数组大小:sizeof(arr)/sizeof(arr[0]),结果固定为3 // some code... }
调用时支持两种方式:
- 不传参数:
foo();此时arr绑定到default_foo_arr - 传自定义数组:
int my_arr[3] = {1,2,3}; foo(my_arr);
为什么这个方案符合你的要求?
- 不需要
std::array:完全基于原生数组实现 - 保留数组大小信息:因为是数组的引用,编译器能在编译期确定数组大小,你可以直接通过
sizeof(arr)计算总字节数,或sizeof(arr)/sizeof(arr[0])得到元素个数 - 避免指针形式:不用
int (*arr)[3],依然保持引用传递的写法习惯
注意点
- 默认数组要用
static修饰:如果放在函数外部,它是全局变量;如果放在函数内部,必须加static让它拥有静态存储周期,否则每次调用函数都会创建新数组,不符合默认参数的预期 - 默认数组的大小必须和函数参数里的数组大小严格一致(都是3),否则类型不匹配,编译器会报错
内容的提问来源于stack exchange,提问作者Kesto2
相关产品推荐
相关产品推荐

