2016-03-03 168 views
8

cppreference.comstatic_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++編譯器的錯誤?

+0

_「MSVC 2015成功編譯上面的代碼。」_不在我的計算機上:_「錯誤C2131:表達式未計算爲常量」_我在Intel和GCC上得到了相同的結果。 – ZDF

+0

@ZDF我有'更新1' - 可能會導致MSVC 2015編譯該代碼(當'static_assert'在類體內部時)。 –

+1

編譯器現在已經在'constexpr'支持的地方;我們在GCC和MSVC中遇到了代碼生成的錯誤。 – Crashworks

回答

1

如果我記得它的權利constexpr函數不能使用,直到他們完全定義和類成員constexpr函數未定義,直到定義類,它意味着你不能在類中使用constexpr成員函數 - 範圍static_assert它定義了這個功能。

但是,你可以使這個功能獨立(它已經是靜態的),它會完成這項工作。它應該到處編譯。

+0

函數是'static',是的,但它取決於模板的參數。 –

+0

@RuslanGaripov,獨立函數也可以有模板參數 – ixSci

+0

好的,非常感謝! –

相關問題