Stwierdzenie statyczne służy do tworzenia asercji w czasie kompilacji. Kiedy asercja statyczna kończy się niepowodzeniem, program po prostu się nie kompiluje. Jest to przydatne w różnych sytuacjach, na przykład w przypadku implementacji niektórych funkcjonalności za pomocą kodu, który jest krytycznie zależny od obiektu o dokładnie 32-bitowej wartości.W swoim kodzie możesz wstawić statyczny dysk twardy, taki jak ten Na innej platformie, o różnej wielkości typie unsigned int
kompilacja się nie powiedzie, co zwróci uwagę autora na problematyczną część kodu i zaleci im ponowne wdrożenie lub ponowną inspekcję.
Inny przykład, może chcesz przekazać jakąś integralną wartość jako void *
wskaźnik do funkcji (hack, ale przydatny czasami) i chcesz się upewnić, że wartość integralną będzie pasować do wskaźnika
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Możesz chcieć aktywów, który char
typu podpisanym
static_assert(CHAR_MIN < 0);
lub że integralną podział z wartościami ujemnymi zaokrągla do zera
static_assert(-5/2 == -2);
I tak dalej.
Asercje czasu pracy w wielu przypadkach mogą być używane zamiast asercji statycznych, ale asercje wykonawcze działają tylko w czasie wykonywania i tylko wtedy, gdy kontrola przechodzi nad asercją. Z tego powodu twierdzenie o niepowodzeniu w działaniu może być uśpione, niewykryte przez dłuższy czas.
Oczywiście wyrażenie w asercji statycznej musi być stałą czasu kompilacji. Nie może to być wartość czasu wykonywania. Dla wartości wykonawczych nie masz innego wyboru niż zwykły assert
.
ZOBACZ TAKŻE: BOOST_MPL_ASSERT, BOOST_MPL_ASSERT_NOT, BOOST_MPL_ASSERT_MSG, BOOST_MPL_ASSERT_RELATION [http://www.boost.org/doc/libs/1_40_0/libs/mpl/doc/refmanual/asserts.html], aby uzyskać więcej opcji. _MSG jest szczególnie przyjemny, gdy już się go nauczysz. – KitsuneYMG