为什么类型扣除不能按预期工作?

ram*_*n1k 0 c++ metaprogramming type-deduction

我对C++元编程中的类型推导有一个小问题.有一定的功能做一些动作.

main.cpp中

template<typename T> void foo(T arg) {
    // do some action on argument
    std::cout << typeid(arg).name() << std::endl;
}


int main(int argc, char** argv) {
    int array[100] = {0};
    std::cout << typeid(array).name() << std::endl;
    foo(array);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

A100_i
Pi     
Run Code Online (Sandbox Code Playgroud)

为什么精氨酸在函数foo的()具有比另一种数据类型数组函数main()中

Naw*_*waz 6

实际上,当您将数组传递给函数时,它会衰减为指针类型.所以T被推断为int*,而不是int[100].

如果要防止衰减,请通过引用接受参数.:

template<typename T> void foo(T & arg) //Note `&` here!
{
  // do some action on argument
   std::cout << (typeid(arg).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

现在它将打印出您期望的内容,即A100_i.看这个在线演示.


问题:当我们通过传递时,为什么数组会衰减到指针类型?

答:因为在C++数组(和函数)中不能通过传递.该语言不允许这样做.相反,当语言作为函数参数传递时,语言要求它们衰减为指针类型.为防止腐烂,我们需要将它们作为参考传递.