c++ - 数组衰减到模板中的指针

标签 c++ templates

请考虑这段代码:

#include <iostream>

template<typename T>
void f(T x) {
    std::cout << sizeof(T) << '\n';
}

int main()
{
    int array[27];
    f(array);
    f<decltype(array)>(array);
}

编者注:原始代码使用了 typeof(array),但这是一个 GCC 扩展。

这将打印

8 (or 4)
108

在第一种情况下,数组显然衰减为指针,T 变成了int*。在第二种情况下,T 被强制为 int[27]。 是否定义了衰减/替代实现的顺序?是否有更优雅的方式强制类型为 int[27]?除了使用 std::vector?

最佳答案

参数使用引用类型

template<typename T> void f(const T& x) 
{
  std::cout << sizeof(T);
}

在这种情况下,数组类型不会衰减。

同样,如果您将模板参数 T 明确指定为数组引用类型,您也可以防止原始版本的 f 衰减

f<int (&)[27]>(array);

在您的原始代码示例中,强制参数 T 具有数组类型(即非引用数组类型,通过使用 typeof 或通过显式指定类型) , 不会阻止数组类型衰减。虽然 T 本身将代表数组类型(如您所见),但参数 x 仍将声明为指针,并且 sizeof x 仍将计算指针大小。

关于c++ - 数组衰减到模板中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1863751/

相关文章:

templates - 关于 postblit 和 move 语义的问题

c++ - 标签分发中的转发参数

c++ - 在 C 和 C++ 中正确使用字符串存储

c++ - boost spirit V2 Qi 语法线程安全吗?

c++ - 如何在主机上构建和访问 libcu++' <cuda/std/mdspan>

c++ - 模板模板参数与函数模板的等效行为

c++ - 为什么未实例化未调用的模板类成员?

c++ - 运算符 + 和 float 参数

c++ - 为什么我的异常被捕获后还是抛出?

c++ - C++ 数组项是否保证位于连续地址中?