我有一个关于 C++ 元编程中类型推导的小问题。 有一定的功能做一些 Action 。
主要.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;
}
输出:
A100_i
Pi
为什么函数 foo() 中的 arg 与函数 main() 中的 array 具有另一种数据类型?
最佳答案
实际上,当您将数组传递给函数时,它会退化为指针类型。所以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;
}
现在它将打印出您期望的内容,即 A100_i
。参见 this online demo .
问题:当我们按值传递时,为什么数组会退化为指针类型?
答案:因为在 C++ 数组(和函数)中不能按值传递。该语言不允许这样做。相反,当它们作为函数参数传递时,语言要求它们退化为指针类型。为了防止衰减,我们需要将它们作为引用传递。
关于c++ - 为什么类型推导不能按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085760/