2010-06-23 5 views
6

इस वाक्य रचना this question के जवाब का एक भाग के रूप में इस्तेमाल किया गया था समझ में:कृपया मदद मुझे इस वाक्य रचना (सी में स्थिर ज़ोर लागू करने ++)

template <bool> 
struct static_assert; 

template <> 
struct static_assert<true> {}; // only true is defined 

#define STATIC_ASSERT(x) static_assert<(x)>() 

मुझे लगता है कि वाक्य रचना समझ में नहीं आता। यह कैसे काम करता है?

मान लीजिए मैं

STATIC_ASSERT(true); 

यह

static_assert<true>(); 

में परिवर्तित हो जाता अब क्या करते हैं?

+0

:) – GManNickG

उत्तर

13
STATIC_ASSERT(true); 

वास्तव में

static_assert<true>(); 

जो कुछ भी करने के लिए मूल्यांकन करता है मतलब है। static_assert<true> किसी भी सदस्य के बिना बस एक खाली संरचना है। static_assert<true>() उस संरचना का एक वस्तु बनाता है और इसे कहीं भी स्टोर नहीं करता है।

यह बस संकलित करता है और कुछ भी नहीं करता है।

दूसरी ओर

STATIC_ASSERT(false); 

पर इसका मतलब

static_assert<false>(); 

जो संकलन त्रुटि का परिणाम है। static_assertfalse के लिए कोई विशेषज्ञता नहीं है। तो एक सामान्य रूप का उपयोग किया जाता है।

template <bool> 
struct static_assert; 

जो एक संरचना के सिर्फ एक घोषणा है और न इसकी परिभाषा: लेकिन सामान्य रूप इस प्रकार दिया जाता है। तो static_assert<false>() संकलन त्रुटि का कारण बनता है क्योंकि यह एक संरचना का ऑब्जेक्ट बनाने की कोशिश करता है जिसे परिभाषित नहीं किया गया है।

+0

+1 उत्कृष्ट स्पष्टीकरण – fingerprint211b

2

ठीक है, मुझे लगता है कि यह टेम्पलेट विशेषज्ञता के बारे में है। STATIC_ASSERT (सत्य) सफलतापूर्वक संकलित होगा, क्योंकि "static_assert < true>" की परिभाषा (केवल एक घोषणा नहीं है) "है।

STATIC_ASSERT (झूठा) कंपाइलर द्वारा खारिज कर दिया जाएगा, क्योंकि "static_assert < false>" और कोई परिभाषा के लिए केवल एक घोषणा नहीं है।

अपडेट: दृश्य स्टूडियो के लिए, STATIC_ASSERT (सही) ठीक है, लेकिन STATIC_ASSERT (गलत) त्रुटि से चलाता है: "त्रुटि C2514: 'static_assert < __formal>': वर्ग कोई कंस्ट्रक्टर्स है [__formal = false साथ]"

एक फोन निर्माता और बाद में एक नाशक है कि दोनों उम्मीद है कि अनुकूलक द्वारा समाप्त कर दिया जाएगा, क्योंकि वे कुछ भी नहीं करना है -
9

static_assert<true>(); कि

template <> 
struct static_assert<true> {} 

टेम्प्लेटेड struct विशेषज्ञता अस्थायी ऑब्जेक्ट निर्माण किया जा रहा है बनाता है। चूंकि true के लिए केवल एक विशेषज्ञता है और टेम्पलेट संरचना का कोई सामान्य संस्करण सभी संरचनाओं का मूल्यांकन नहीं करता है जो static_assert<false>(); का मूल्यांकन नहीं करेंगे।

+0

स्पष्टीकरण के लिए धन्यवाद, मैं भी इस वाक्यविन्यास में खुद को खो गया। – PeterK

4

अभिव्यक्ति

static_assert<true>(); 
static_assert<true> के बाद से

में एक प्रकार है, यह static_assert<true> के निर्माता कॉल करेंगे। static_assert<true> एक खाली संरचना के लिए विशिष्ट है, कुछ भी प्रभावित नहीं होगा।


हालांकि,

static_assert<false>(); 

में के रूप में static_assert<false> के लिए कोई विशेषज्ञता, सामान्य परिभाषा

template <bool> 
struct static_assert; 

उपयोग किया जाएगा है। लेकिन यहां, static_assert<B> टाइप अपूर्ण है। इसलिए static_assert<B> के कन्स्ट्रक्टर को कॉल करने से संकलन त्रुटि हो जाएगी।


इसलिए, इस "स्थिर ज़ोर" कहा जाता है अभिव्यक्ति false, normal assert() function कि क्रम में कार्यक्रम मार डालेगा के लिए इसी तरह का मूल्यांकन करता है, तो के रूप में बयान संकलन रद्द कर देगा।

संबंधित मुद्दे