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()中?
实际上,当您将数组传递给函数时,它会衰减为指针类型.所以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++数组(和函数)中不能通过值传递.该语言不允许这样做.相反,当语言作为函数参数传递时,语言要求它们衰减为指针类型.为防止腐烂,我们需要将它们作为参考传递.