当 ArrayCount 是模板时,clang 和 gcc 都无法编译下面的代码。这似乎是错误的,特别是考虑到 sizeof ArrayCount 解决方案有效的事实。ArrayCount 的模板版本通常是一个更好的解决方案,但它在这里遇到了阻碍,并且 constexpr 似乎没有兑现其承诺的精神。
#if 1
template<typename T, size_t N>
constexpr size_t ArrayCount(T (&)[N])
{
return N;
}
// Results in this (clang): error : static_assert expression is not an integral constant expression
// Results in this (gcc): error: non-constant condition for static assertion, 'this' is not a constant expression
#else
#define ArrayCount(t) (sizeof(t) / sizeof(t[0]))
// Succeeds
#endif
struct X
{
int x[4];
X() { static_assert(ArrayCount(x) == 4, "should never fail"); }
};