2016-03-03 22 views
8

Reading cppreference.com:static_assert i Intel kompilator C++

Statyczny deklaracja dochodzić może pojawić się w ramach bloku (w bloku deklaracji) oraz wewnątrz ciała klasy (jako deklaracja członkiem)

OK, teraz mam następujący kod:

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"); 
}; 

Ne ither MSVC 2015 ani Intel C++ 16.0.2 kompilują ten kod (pierwszy z nich pokazuje "błąd C2131: wyrażenie nie zostało ocenione jako stałe", a drugi pokazuje "wywołanie funkcji musi mieć stałą wartość w stałym wyrażeniu" błąd i wskazuje na wywołanie maxAlignment w static_assert).

Ale MSVC 2015 Update 1 ma skompilować następujący kod, podczas gdy Intel C++ 16.0.2 nie:

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 

(Tak, MSVC poradzi static_assert gdy jest wewnątrz szablonu klasie body)

Jednak następujący kod został pomyślnie skompilowany przez oba kompilatory (static_assert znajduje się poza treścią klasy, pojawia się w zakresie bloku):

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"); 

Moje pytanie brzmi:: Czy brakuje czegoś lub jest to, że Intel C++ błąd kompilatora?

+0

_ "MSVC 2015 kompiluje powyższy kod z powodzeniem." _ Nie na moim komputerze: _ "błąd C2131: wyrażenie nie miało stałej wartości" _ Otrzymałem ten sam wynik na Intel i GCC. – ZDF

+0

@ZDF Mam "Update 1" - może to spowodować, że MSVC 2015 skompiluje ten kod (gdy 'static_assert' znajduje się w treści klasy). –

+1

Kompilatory są teraz na miejscu w obsłudze 'constexpr'; natknęliśmy się na błędy generowania kodu w GCC i MSVC. – Crashworks

Odpowiedz

1

Jeśli dobrze pamiętam, funkcje constexpr nie mogą być używane, dopóki nie zostaną w pełni zdefiniowane, a funkcje constexpr należące do klasy są niezdefiniowane, dopóki klasa nie zostanie zdefiniowana, co oznacza, że ​​nie można używać funkcji-składowej wewnątrz klasy -scope static_assert, która definiuje tę właśnie funkcję.

Ale możesz ustawić tę funkcję jako samodzielną (i tak już jest ona statyczna) i wykona to zadanie. Powinien kompilować się wszędzie.

+0

Funkcja jest "statyczna", tak, ale zależy to od argumentów szablonu. –

+0

@RuslanGaripov, funkcje autonomiczne mogą mieć również argumenty szablonu – ixSci

+0

OK, wielkie dzięki! –