static_assert 和英特尔 C++ 编译器

static_assert and Intel C++ compiler

阅读cppreference.com:

A static assert declaration may appear at block scope (as a block declaration) and inside a class body (as a member declaration)

好的,现在我有以下代码:

struct foo_t
{
    static constexpr std::size_t maxAlignment()
    {
        // This is just a sample; I removed real code from this method.
        return std::max(alignof(__m128), __alignof(__m256));
    }

    static_assert(0 == ((maxAlignment() -1) & maxAlignment()), "some message");
};

MSVC 2015 和 Intel C++ 16.0.2 均未编译此代码(前者显示 "error C2131: expression did not evaluate to constant" 后者显示 "function call must have a constant value in a constant expression" 错误并指向 maxAlignment 在 [=15 中的调用=]).

但 MSVC 2015 Update 1 编译以下代码,而 Intel C++ 16.0.2 不会:

template <typename T, std::size_t Alignment>
struct foo_t
{
    static constexpr std::size_t maxAlignment()
    {
        return std::max(std::alignment_of<T>::value, Alignment);
    }

    static_assert(0 == ((maxAlignment() -1) & maxAlignment()), "some message");
};

foo_t<__m128, 16> foo {};
// foo_t<__m128, 33> boo {};  // here `static_assert` will stop compilation

(因此,当 MSVC 在 模板 class 正文中时,它可以处理 static_assert

但是以下代码被两个编译器成功编译(static_assert 在 class 主体之外;它出现在块范围内):

struct foo_t
{
    static constexpr std::size_t maxAlignment()
    {
        return std::max(alignof(__m128), __alignof(__m256));
    }
};

static_assert(0 == ((foo_t::maxAlignment() -1) & foo_t::maxAlignment()), "some message");

我的问题是:我是不是遗漏了什么或者是英特尔 C++ 编译器的错误?

如果我没记错的话,constexpr 函数在完全定义之前不能使用,并且 class-member constexpr 函数在 class 定义之前是未定义的,这意味着你可以' t 在 class-scope static_assert 内使用 constexpr 成员函数,它定义了这个函数。

但是你可以让这个函数独立(无论如何它已经是静态的)并且它会完成这项工作。它应该到处编译。