以下是我遇到的情况的简化版本
#include <array>
template <typename T, size_t BufferSize>
constexpr
size_t size(const std::array<T, BufferSize>&) { return BufferSize; }
template <typename T, size_t BufferSize>
constexpr size_t size(const T (&)[BufferSize]) { return BufferSize; }
template <typename Num, typename Buff>
inline Num func(const Num& num, Buff& buff)
{
enum
{
min_size = 6, // Just for test
};
static_assert(size(buff) >= min_size, "");
return num;
}
int main()
{
//std::array<char, 8> buff;
char buff[8];
return func(7U, buff);
}
此代码使用g ++ 4.9.2进行编译,但是对于两种数组类型,clang ++ 3.6都会产生以下错误:
error: static_assert expression is not an integral constant expression
static_assert(size(buff) >= min_size, "");
~~~~~^~~~~~~~~~~~~~~~~
我可以假设clang是正确的,因为size函数的输入参数不是constexpr。另一方面,参数本身并未真正使用。
所以,我的问题是根据标准,哪个编译器是正确的?