C++ 静态断言和英特尔C++;编译程序

C++ 静态断言和英特尔C++;编译程序,c++,visual-c++,static-assert,icc,C++,Visual C++,Static Assert,Icc,阅读: 静态断言声明可能出现在块范围内(作为块) 声明)和类主体内的(作为成员声明) 好的,现在我有以下代码: 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(__

阅读:

静态断言声明可能出现在块范围内(作为块) 声明)和类主体内的(作为成员声明)

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

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也不英特尔C++ +16.0.2编译此代码(前者显示错误C2131:表达式没有被计算为常量),后者显示“函数调用必须在常量表达式中有一个常量”错误,并指向<代码>最大对齐>代码> <代码> STATICOSACSTATE< <代码> > <>但MSVC 2015更新1 <强> < <强> >编译以下代码,而英特尔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

< > >强>我的问题是:我错过了什么东西还是英特尔C++编译器的错误?

< p>如果我记得它,直到完全定义了COSTEXPR函数才能使用,类成员CONTHEXPR函数直到定义了类才被定义,这意味着不能在类范围内使用CONTXPR成员函数。
static\u assert
,它定义了这个函数


但是,您可以将此函数设置为独立函数(它已经是静态的),它将完成此工作。它应该到处编译。

“MSVC 2015成功地编译了上面的代码。”不是在我的计算机上:“错误C2131:表达式没有计算为常量”我在Intel和GCC上得到了相同的结果。@ZDF我有“更新1”-这可能是导致MSVC 2015编译该代码的原因(当
static\u assert
在类主体中时).编译器现在在
constexpr
支持上随处可见;我们在GCC和MSVC中遇到了代码生成错误。Ruslan,我不明白。我的意思是,我从三个编译器中得到了相同的错误@Crashworks很难相信这三个编译器都是同样的错误。可能是关于某个模糊的ISO语句。MSVC2015-U1编译您的更新代码的原因可能是:“…我们已经修复了约45个与constexpr使用相关的错误…在这一领域我们的积压工作中还有约30个错误…”函数是
static
,是的,但它取决于模板的参数。@RuslanGaripov,独立函数可能也有模板参数,但事实上ICC无法编译模板类——这又如何呢?这是一个编译器错误吗?@RuslanGaripov,我会说是的-这是一个错误,因为所有其他编译器都编译它。但可以肯定的是,我会向标准咨询这是一个bug:
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");