问题描述
请考虑此代码:
#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);
}
编辑注: c $ c> typeof(array),但是这是一个GCC扩展。
Editor's Note: the original code used typeof(array)
, however that is a GCC extension.
这将打印
8 (or 4)
108
在第一种情况下,数组明显衰减为指针,T变为 int *
。在第二种情况下,T被强制为 int [27]
。
是否定义了衰减/替换实现的顺序?是否有更优雅的方式强制类型 int [27]
?除了使用std :: vector?
In the first case, the array obviously decays to a pointer and T becomes int*
. In the second case, T is forced to int[27]
.Is the order of decay/substitution implementation defined? Is there a more elegant way to force the type to int[27]
? Besides using std::vector?
推荐答案
使用参数
template<typename T> void f(const T& x)
{
std::cout << sizeof(T);
}
在这种情况下,数组类型不会衰减。
in which case the array type will not decay.
同样,如果您明确指定模板 f
,则还可以防止原始版本中的腐败c $ c> T 作为引用到数组类型
Similarly, you can also prevent decay in your original version of f
if you explicitly specify the template agument T
as a reference-to-array type
f<int (&)[27]>(array);
在原始代码示例中,强制使用 T
具有数组类型(即非引用数组类型,通过使用 typeof
或通过明确指定类型),不会阻止数组类型衰减。而 T
本身将代表数组类型(如你所观察到的),参数 x
将仍然被声明为指针和 sizeof x
仍会评估指针大小。
In your original code sample, forcing the argument T
to have the array type (i.e. non-reference array type, by using typeof
or by specifying the type explicitly), will not prevent array type decay. While T
itself will stand for array type (as you observed), the parameter x
will still be declared as a pointer and sizeof x
will still evaluate to pointer size.
这篇关于数组衰减到模板中的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!