在C++中通过引用传递整个数组的不同方法
#include <iostream>
template <class T>
void call_1(T& in){
printf("%dn", sizeof(in)); // 12
}
template <int N>
void call_2(int (&in)[N]){
printf("%dn", sizeof(in)); // 12
}
int main(){
int a[] = {1,2,3};
call_1(a);
call_2(a);
return 0;
}
根据上面的代码片段,我有几个问题:
1-是call_1与call_2都有效的方式来传递通过引用整个阵列?
2- 为什么T&需要在call_1. 如果&省略,则传递指向数组第一个元素的指针。为什么不T&传递对数组第一个元素的引用,而是引用整个数组?
3-为什么我不能写template <T N>在call_2一个避免硬编码int?这不是有效的语法吗?
回答
1. 是的,两者都有效。
2. 的类型a是int[3]。但是大多数右值上下文中的数组,例如按值传递时,会衰减为指针。通过引用传递时不会发生衰减,因此您最终会得到int(&)[3].
3.当然可以,但是数组维数的类型不是T,而是size_t.
所以它应该是这样的:
template <typename T, std::size_t N>
void call_2(T (&in)[N]){
printf("%dn", sizeof(in)); // 12
}