在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_1call_2都有效的方式来传递通过引用整个阵列?

2- 为什么T&需要在call_1. 如果&省略,则传递指向数组第一个元素的指针。为什么不T&传递对数组第一个元素的引用,而是引用整个数组?

3-为什么我不能写template <T N>call_2一个避免硬编码int?这不是有效的语法吗?

回答

1. 是的,两者都有效。

2. 的类型aint[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
}


以上是在C++中通过引用传递整个数组的不同方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>