c++ - 为什么类型推导不能按预期工作?

标签 c++ metaprogramming type-deduction

我有一个关于 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/

相关文章:

module - 为模块中的每个子类型生成一个方法

ruby - 如何在 Ruby 中列出局部变量?

c++ - Amqpcpp undefined symbol

c++自定义映射键/值不按顺序

Objective-C 动态创建的方法和编译器警告

c++ - 如何访问模板参数的成员? "Member access to incomplete type"

c++ - 从第一类型的第二个非类型参数推导第一类型

c++ - 尝试实现C++函数

c++ - 使用 std::unique_ptr<T>& 而不是 std::unique_ptr<T> 有什么优势吗?

c++ - 为什么允许这种 C++ 类型推导