问题描述
|
我发现本文提供了以下模板和用于获取数组大小的宏:
template<typename Type,size_t Size>
char ( &ArraySizeHelper(Type( &Array )[Size]) )[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
我发现以下部分完全不清楚。 sizeof
应用于函数声明。我希望结果是“函数指针的大小”。为什么它获得“返回值的大小”呢?
解决方法
template<typename Type,size_t Size>
char (&ArraySizeHelper(Type(&Array)[Size]))[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
sizeof
应用于函数声明。我希望结果是“函数指针的大小”。为什么它获得“返回值的大小”呢?
它不是sizeof ArraySizeHelper
(这是非法的-不能接受sizeof
一个函数),也不是sizeof &ArraySizeHelper
-甚至不是隐式的,因为对于C ++,标准明确禁止从函数到指针到函数的隐式转换。 0x参见5.3.3)。相反,它是sizeof ArraySizeHelper(Array)
,等于函数调用返回的值sizeof
,即sizeof char[Size]
,因此是Size
。
,sizeof
应用于函数调用的结果,而不是声明。因此,它给出了返回值的大小,在这种情况下,该值是对chars数组的引用。
该模板使返回类型中的数组具有与参数数组相同数量的元素,该参数数组是从宏馈送到函数的。
最后,将“ 1”应用于对此char数组的引用。引用上的sizeof
与类型本身上的sizeof
相同。从ѭ15开始,给出数组中元素的数量。
,ArraySizeHelper
是一个函数模板,它返回大小为Size
的char
数组。模板有两个参数,一个是类型(is19ѭ),另一个是值(Size
)。
因此,当您向函数传递类型为A[100]
的对象时。编译器推导出模板的两个参数:Type
变为A
,Size
变为100
。
因此,实例化的函数返回类型变为char[100]
。由于never1ѭ的参数从不求值,因此该函数无需定义。 sizeof
只需要知道函数的返回类型which26ѭ。这相当于sizeof(char[100])
,它返回100-数组的大小。
要注意的另一个有趣点是,sizeof(char)
与编译器无关,与其他原始类型(char1的变体除外)不同。它总是1
。所以sizeof(char[100])
保证是100
。
1.char
的所有变体的大小均为1,根据标准为char
,signed char
,unsigned char
。