2010-06-23 11 views

Odpowiedz

13
STATIC_ASSERT(true); 

rzeczywiście oznacza

static_assert<true>(); 

rozpoznawaną na niczym. static_assert<true> jest po prostu pustą strukturą bez żadnych członków. static_assert<true>() tworzy obiekt tej struktury i nie przechowuje go w dowolnym miejscu.

To po prostu kompiluje i nie robi nic.

Z drugiej strony

STATIC_ASSERT(false); 

oznacza

static_assert<false>(); 

co powoduje błąd kompilacji. static_assert nie specjalizuje się w false. Używana jest więc ogólna forma. Ale ogólna forma jest podana następująco:

template <bool> 
struct static_assert; 

, która jest tylko deklaracją struktury, a nie jej definicją. Tak więc static_assert<false>() powoduje błąd kompilacji, ponieważ próbuje uczynić obiekt struktury, która nie jest zdefiniowana.

+0

+1 Doskonałe wyjaśnienie – fingerprint211b

2

Cóż, myślę, że chodzi o specjalizację szablonów. STATIC_ASSERT (true) zostanie pomyślnie skompilowany, ponieważ istnieje definicja (a nie tylko deklaracja) "static_assert < true>".

STATIC_ASSERT (false) zostanie odrzucone przez kompilator, ponieważ istnieje tylko deklaracja "static_assert < false>" i brak definicji.

Update: dla visual studio, STATIC_ASSERT (prawda), jest ok, ale STATIC_ASSERT (fałsz) powoduje błąd: "error C2514: 'static_assert < __formal>': klasa ma konstruktorów [z __formal = false]"

9

static_assert<true>(); sprawia, że ​​

template <> 
struct static_assert<true> {} 

matrycy specjalizacja struct tworzenie tymczasowy obiekt robi - wywołanie konstruktora i destruktora później, że obie będą nadzieją wyeliminowany przez optymalizator ponieważ nic nie robić. Ponieważ istnieje tylko specjalizacja dla true i nie ma ogólnej wersji szablonu struct, wszystkie konstrukty, które oceniają na static_assert<false>();, po prostu się nie skompilują.

+0

Dziękuję za wyjaśnienie, ja też znalazłem się zagubiony w tej składni. – PeterK

4

W wyrażeniu

static_assert<true>(); 

od static_assert<true> jest typem, to wywołać konstruktor static_assert<true>. Ponieważ static_assert<true> specjalizuje się w pustej strukturze, nic nie będzie miało wpływu.


Jednak w

static_assert<false>(); 

jak nie ma specjalizacji dla static_assert<false> definicja generic

template <bool> 
struct static_assert; 

zostaną wykorzystane. Ale tutaj, typ static_assert<B> jest niekompletny niekompletny. Wywołanie konstruktora static_assert<B> spowoduje błąd kompilacji.


Dlatego nazywa się to „statyczna assert” jako oświadczenie będzie przerwać kompilacja jeśli wyrażenie do false, podobny do normal assert() function że zabije program w czasie pracy.

Powiązane problemy