2016-11-23 7 views
35

सी ++ में निम्नलिखित अवैध क्यों हैं?"हस्ताक्षरित int" प्रकार के साथ कन्स्ट्रक्टर सिंटैक्स का उपयोग क्यों नहीं किया जा सकता है?

auto y = int(0); 
auto z = unsigned(0); 
auto w = float(0); 

या सामान्य रूप में:

auto x = unsigned int(0); 

निम्नलिखित जबकि सब ठीक हैं

auto t = Type(... c-tor-args ...); 

(Type का अपवाद है unsigned int के साथ)।

+3

बेशक तुम सिर्फ कह सकते हैं 'ऑटो एक = 10u' हैं, लेकिन आप शायद उस जानता था। आपके द्वारा उपयोग किए जा रहे वाक्यविन्यास में निर्माण के साथ कुछ भी नहीं है, भले ही यह सतही रूप से जैसा दिखता हो। सही प्रकार के अक्षर का प्रयोग करें और यही वह है। –

उत्तर

32

वाक्य रचना Explicit type conversion (functional notation) यहाँ है। व्याकरणिक नियम के अनुसार, यह केवल सरल प्रकार के विनिर्देशक या टाइपपीफ विनिर्देशक (यानी एक शब्द-शब्द प्रकार) के साथ काम करता है।

(जोर मेरा)

2) कार्यात्मक डाली अभिव्यक्ति एक सरल प्रकार निर्दिष्टकर्ता या एक typedef विनिर्देशक (दूसरे शब्दों में होते हैं, एक-शब्द टाइप नाम: unsigned int(expression) या int*(expression) नहीं मान्य हैं), इसके बाद कोष्ठक में एक अभिव्यक्ति के बाद। यह कास्ट अभिव्यक्ति इसी सी-शैली कास्ट अभिव्यक्ति के बराबर है।

आप सी शैली डाली अभिव्यक्ति या static_cast के लिए इसे बदल, या typedef विनिर्देशक के साथ उपयोग के रूप में @ जीन FrançoisFabre सुझाव दिया जा सकता है।

मानक से
auto x1 = (unsigned int)(0); 
auto x2 = static_cast<unsigned int>(0); 

उद्धरण, $5.2.3/1 Explicit type conversion (functional notation) [expr.type.conv]

एक साधारण प्रकार-विनिर्देशक ([dcl.type.simple]) या typename-विनिर्देशक ([temp.res]) एक parenthesized वैकल्पिक द्वारा पीछा किया अभिव्यक्ति-सूची या एक ब्रसेड-इनिट-सूची (प्रारंभकर्ता) द्वारा प्रारंभिककर्ता को दिए गए निर्दिष्ट प्रकार का मान बनाता है।

और $7.1.7.2/1 Simple type specifiers [dcl.type.simple]

सरल प्रकार विनिर्देशक

simple-type-specifier: 
    nested-name-specifieropt type-name 
    nested-name-specifier template simple-template-id 
    nested-name-specifieropt template-name 
    char 
    char16_t 
    char32_t 
    wchar_t 
    bool 
    short 
    int 
    long 
    signed 
    unsigned 
    float 
    double 
    void 
    auto 
    decltype-specifier 
type-name: 
    class-name 
    enum-name 
    typedef-name 
    simple-template-id 
decltype-specifier: 
    decltype (expression) 
    decltype (auto) 
+0

मुझे लगता है कि 'हस्ताक्षरित (0)' भी काम करेगा। – Asu

+0

@Asu हां, क्योंकि यह एक साधारण प्रकार का विनिर्देशक है। – songyuanyao

+0

क्या आप इस बोली के बारे में विशिष्ट हो सकते हैं? धन्यवाद :) – Steve

20

प्राथमिकता पार्सिंग के कारण। संकलक खो गया है क्योंकि int(0)unsigned int से पहले मेल खाता है।

आप कोष्ठक में अपने प्रकार संलग्न करने के लिए है:

auto x = (unsigned int)(0); 

या एक typedef का उपयोग करें:

typedef unsigned int uint; 
auto x = uint(0); 
+2

मुझे यकीन नहीं है कि "ऑपरेटर प्राथमिकता" यहां सही शब्द है। – juanchopanza

+3

मुझे यकीन नहीं है। आप क्या सुझाव देंगे? प्राथमिकता पार्सिंग? मैं उस तरह से संपादन कर रहा हूँ। –

+3

पार्सिंग प्राथमिकता शायद पर्याप्त रूप से स्पष्ट है, लेकिन यह वास्तव में भाषा के व्याकरण का नियम है। फंक्शन-स्टाइल कास्ट एक पहचानकर्ता होना चाहिए। –

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

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