2016-03-10 7 views
6

को देखते हुए this test program:यह "कॉल" क्यों केवल एक के बजाय दो तर्क देखने का दावा करता है?

#include <cassert> 
#include <string> 
#include <type_traits> 

const std::string& const_string = "bla"; 
std::string const & string_const = "blabla"; 

static_assert(std::is_same<decltype(const_string), decltype(string_const)>::value, "Uhoh"); 

int main() 
{ 
    assert(std::is_same<decltype(const_string), decltype(string_const)>::value); 
} 

कौन सा दावा है कि दो प्रकार के संकलन समय पर और रनटाइम पर सी ज़ोर का उपयोग कर एक ही हैं। बजना, MSVC2015, और जीसीसी के सभी एक ही त्रुटि की सूचना देती है, इसलिए मैं काफी यकीन है कि it's me हूँ:

main.cpp:13:49: error: too many arguments provided to function-like macro invocation 
    assert(std::is_same<decltype(const_string), decltype(string_const)>::value); 
               ^
/usr/include/assert.h:91:10: note: macro 'assert' defined here 
# define assert(expr)             \ 
     ^

मैं सिर्फ assert में दो तर्क नहीं दिखाई दे रहा। और क्या है, static_assert बस ठीक काम करता है ... तो यहाँ क्या चल रहा है?

+0

मेरा मानना ​​है कि प्रीप्रोसेसर दो "तुलना" देखता है; 'std :: is_same :: value'। प्रीप्रोसेसर को यह बताने का कोई तरीका नहीं है कि वे नहीं हैं। – molbdnilo

+1

** static_assert ** एक कीवर्ड है, ** ** एक प्रीप्रोसेसर मैक्रो जोर दें। प्रीप्रोसेसर मैक्रोज़ ने गैर-स्मार्ट तरीके से ',' द्वारा तर्क विभाजित किया। अतिरिक्त कोष्ठक इसे रोकते हैं। – Youka

उत्तर

3

यह < और > टोकन की वजह से है। वे प्रीप्रोसेसर गड़बड़ करते हैं। याद रखें कि assert एक मैक्रो है, फ़ंक्शन नहीं।

इस (कोष्ठकों का एक अतिरिक्त सेट जोड़ने) है:

assert((std::is_same<decltype(const_string), decltype(string_const)>::value)); 
    ^                ^
4

सी पूर्वप्रक्रमक सी को नहीं पहचानता है ++ टेम्पलेट वाक्य रचना, इसलिए टेम्पलेट कोष्ठक < और > पूर्वप्रक्रमक द्वारा टोकन समूहीकरण के रूप में देखा नहीं कर रहे हैं, वे ' सरल पात्रों के रूप में देखा जाता है।

इसका मतलब है कि पूर्वप्रक्रमक इस तरह एक मैक्रो पैरामीटर विभाजक के रूप में टेम्पलेट मापदंडों के बीच अल्पविराम देखने जाएगा,:

assert(
    std::is_same<decltype(const_string), 
    decltype(string_const)>::value); 

एक भी बयान के रूप में अपनी अभिव्यक्ति को देखने के लिए पूर्वप्रक्रमक बाध्य करने के लिए, बस अपने assert लपेट कोष्ठक का एक अतिरिक्त सेट में पैरामीटर:

assert((std::is_same<decltype(const_string), decltype(string_const)>::value)); 

static_assert क्योंकि यह एक C++ keyword है, बल्कि assert() की तरह एक पूर्वप्रक्रमक मैक्रो से इस सीमा नहीं है । इसका मतलब है कि यह पूरी तरह से सी ++ वाक्यविन्यास का समर्थन करता है और टेम्पलेट पैरामीटर को सही ढंग से देखता है।

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