讀cppreference.com:static_assert和英特爾C++編譯器
靜態斷言聲明可以在塊範圍出現(作爲塊 聲明)和類體內(作爲成員聲明)
好了,現在我有以下代碼:
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");
};
氖ither MSVC 2015或英特爾C++ 16.0.2編譯此代碼(前者顯示「錯誤C2131:表達式未計算爲常量」,後者顯示「函數調用在常量表達式中必須具有常量值」錯誤,並指向調用maxAlignment
in static_assert
)。
但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
(所以,MSVC可以處理static_assert
當它是一個模板類中body)
但是,下面的代碼由兩個編譯器成功編譯(static_assert
在類體外;它出現在塊範圍內):
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++編譯器的錯誤?
_「MSVC 2015成功編譯上面的代碼。」_不在我的計算機上:_「錯誤C2131:表達式未計算爲常量」_我在Intel和GCC上得到了相同的結果。 – ZDF
@ZDF我有'更新1' - 可能會導致MSVC 2015編譯該代碼(當'static_assert'在類體內部時)。 –
編譯器現在已經在'constexpr'支持的地方;我們在GCC和MSVC中遇到了代碼生成的錯誤。 – Crashworks