为什么sizeof运算符无法在函数模板中工作?

Rec*_*ker -1 c++ templates sizeof

我正在尝试学习C++函数模板.我传递一个数组作为指向我的函数模板的指针.在那,我试图找到一个数组的大小.这是我使用的功能模板.

template<typename T>
T* average( T *arr)
{
    T *ansPtr,ans,sum = 0.0;    

    size_t sz = sizeof(arr)/sizeof(arr[0]);
    cout<<"\nSz is "<<sz<<endl;

    for(int i = 0;i < sz; i++)
    {
        sum = sum + arr[i];
    }
    ans = (sum/sz);
    ansPtr = &ans;
    return ansPtr;
}
Run Code Online (Sandbox Code Playgroud)

即使我将指针传递给整数数组,该cout语句也会显示arras 的大小.现在我知道这可能是我之前提到的问题的可能重复,但我需要对此有更好的解释.15

我唯一能想到的是,因为模板是在运行时调用的,并且sizeof是一个编译时运算符,所以编译器只是忽略了这一行

   int sz = sizeof(arr)/sizeof(arr[0]);
Run Code Online (Sandbox Code Playgroud)

因为在实际调用函数之前它不知道arr的确切类型.这是正确的还是我错过了这里的东西?将指针发送到函数模板也是可靠的吗?

R. *_*des 6

 T *arr
Run Code Online (Sandbox Code Playgroud)

这是C++的" arr 是一个指针T".sizeof(arr)显然,这意味着"指针的大小arr",而不是"数组的大小arr".这是该计划中的关键缺陷.

为了获得数组的大小,该函数需要在数组上运行,显然不是在指针上运行.众所周知(对吧?)数组不是指针.

此外,平均函数应返回平均值.但这T*是一个"指针T".平均函数不应返回指向值的指针.这不是一个价值.

具有指针返回类型不是最后一次攻击:返回指向局部变量的指针是最糟糕的.你为什么要偷酒店房间钥匙?

template<typename T, std::size_t sz>
T average( T(&arr)[sz])
{
    T ans,sum = 0.0;    

    cout<<"\nSz is "<<sz<<endl;

    for(int i = 0;i < sz; i++)
    {
        sum = sum + arr[i];
    }
    ans = (sum/sz);
    return ans;
}
Run Code Online (Sandbox Code Playgroud)