请考虑这段代码:
#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/