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?
_ "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
@ZDF Mam "Update 1" - może to spowodować, że MSVC 2015 skompiluje ten kod (gdy 'static_assert' znajduje się w treści klasy). –
Kompilatory są teraz na miejscu w obsłudze 'constexpr'; natknęliśmy się na błędy generowania kodu w GCC i MSVC. – Crashworks