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应用于函数声明.我希望结果是"函数指针的大小".为什么它会获得"返回值的大小"呢?
sizeof应用于函数调用的结果,而不是声明.因此,它给出了返回值的大小,在这种情况下,它是对字符数组的引用.
该模板使返回类型中的数组具有与参数数组相同数量的元素,该数组从宏中提供给函数.
最后,sizeof然后应用于对此char数组的引用.sizeof在引用sizeof上与类型本身相同.因为sizeof(char) == 1,这给出了数组中的元素数量.
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.