数组衰减到模板中的指针

Gun*_*iez 6 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);
}
Run Code Online (Sandbox Code Playgroud)

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

这将打印

8 (or 4)
108
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 9

使用参数的引用类型

template<typename T> void f(const T& x) 
{
  std::cout << sizeof(T);
}
Run Code Online (Sandbox Code Playgroud)

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

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

f<int (&)[27]>(array);
Run Code Online (Sandbox Code Playgroud)

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