先請各位看看代碼,思考一下,這里的代碼是做什么的?
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];//沒有定義,只做了聲明
// That gcc wants both of these prototypes seems mysterious. VC, for
// its part, can't decide which to use (another mystery). Matching of
// template overloads: the final frontier.
#ifndef _MSC_VER
template 
<typename T, size_t N>
char (&ArraySizeHelper(const T (&array)[N]))[N];
#endif
#define arraysize(array) (sizeof(ArraySizeHelper(array)))

int a[10]
int size = arraysize(a);//這里能夠求出a的大小

這個代碼比普通的sizeof(a)/sizeof(int)更安全,它避免了我們做這樣的操作:
int a[10]
int *= a;

int size = arraysize(p);//不可行
size = arraysize(a);//可行
利用模板獲得一個數組的引用,返回對應的char類型的數組引用再對char類型的數組求大小,不用求sizeof(T),代替了了除法運算和兩次求值sizeof(),不知道這個會不會影響編譯時的效率
template <typename T, size_t N>
char (*ArraySizeHelper(const T (&array)[N]))[N];
#define arraysize(array) (sizeof(*ArraySizeHelper(array)))
據waiting4you的評論,也可以這樣做: 
對于老的編譯器,不允許返回數組的引用,但是返回指針數組應該是沒有問題的,入口參數傳遞數組的引用也沒有問題