在static_assert中使用constexpr非成员大小函数

时间:2015-03-07 16:08:55

标签: c++ g++ clang++

以下是我遇到的情况的简化版本

#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。另一方面,参数本身并未真正使用。

所以,我的问题是根据标准,哪个编译器是正确的?

0 个答案:

没有答案