"sizeof"如何在这个帮助器中用于确定数组大小?

sha*_*oth 3 c++ arrays size templates

我发现这篇文章提出了以下模板和一个用于获取数组大小的宏:

template<typename Type, size_t Size>
char ( &ArraySizeHelper(Type( &Array )[Size]) )[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
Run Code Online (Sandbox Code Playgroud)

我发现以下部分完全不清楚.sizeof应用于函数声明.我希望结果是"函数指针的大小".为什么它会获得"返回值的大小"呢?

ham*_*mar 6

sizeof应用于函数调用的结果,而不是声明.因此,它给出了返回值的大小,在这种情况下,它是对字符数组的引用.

该模板使返回类型中的数组具有与参数数组相同数量的元素,该数组从宏中提供给函数.

最后,sizeof然后应用于对此char数组的引用.sizeof在引用sizeof上与类型本身相同.因为sizeof(char) == 1,这给出了数组中的元素数量.


Ton*_*roy 5

template<typename Type, size_t Size>
char (&ArraySizeHelper(Type(&Array)[Size]))[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
Run Code Online (Sandbox Code Playgroud)

sizeof应用于函数声明.我希望结果是"函数指针的大小".为什么它会获得"返回值的大小"呢?

它不是sizeof ArraySizeHelper(这是非法的 - 不能接受sizeof函数),也不是sizeof &ArraySizeHelper- 甚至不是隐含的,因为标准明确禁止从函数到指针到函数的隐式转换,对于C++ 0x见5.3.3).相反,它sizeof ArraySizeHelper(Array)等于sizeof函数调用返回的值,即 sizeof char[Size]因此Size.