关于非类型模版形参——数组为什么要以引用传值
函数里并没有改变数组里的值,为什么一定要用引用?
代码如下:
#include <iostream>非类型模版形参 数组
#include <string>
#include <vector>
using namespace std;
template <class T, size_t N>
size_t size( T (&arr)[N] ) // 为什么要用引用
{
return N;
}
template <class T, size_t N>
void printValues( const T (&arr)[N] ) // 为什么要用引用
{
for ( size_t i = 0; i != N; ++i )
{
cout << arr[ i ] << endl;
}
}
int main()
{
int a[] = { 1, 2, 3, 4 };
int length = size( a );
printValues( a );
return 0;
}
[解决办法]
直接传数组的话, 数组名会退化成指针.
[解决办法]
无规定一定要用引用,用指向数组的指针一样可以,如下所示,只不过用引用可以在函数内部获得简洁清晰的语法结构:
template< typename T, size_t N >
void fun( T ( *p )[N] )
{
std::cout << ( *p )[1] << std::endl;
}
int main()
{
int a[ 10 ] = { 100, 200, 300 };
double b[ ] = { 50.24, 60.32, 70.99 };
fun( &a );
fun( &b );
return 0;
}
[解决办法]
数组传引用能避免数组退化为指针,可以保留数组的长度信息
[解决办法]
因为模板参数 已经有数组的大小信息了,size_t N,这个N不是变量,是常量。
每次使用这个模板,都是用N个都是一个定值,也许只是为了模板匹配更好而已;
这个模板的代码膨胀的速度是惊人的;
[解决办法]
这就是指针与引用的区别:引用由指针的高效,但是没有指针的“拖沓”(比如,&, ->, *)
这里完全可以用指针。
[解决办法]