2017-08-17 7 views
10

में दिखाई देने वाले फ़ंक्शन में घोषित की गई है यह कोड क्यों काम करता है? c++14सी ++ संरचना मुख्य

// Example program 
#include <iostream> 
#include <string> 
using namespace std; 


auto fun() 
{ 
    struct a 
    { 
     int num = 10; 
     a() 
     { 

      cout << "a made\n"; 
     } 
     ~a() 
     { 
      cout << "a destroyed\n"; 
     } 
    }; 
    static a a_obj; 
    return a_obj; 
} 


int main() 
{ 
    auto x = fun(); 
    cout << x.num << endl; 

} 

साथ कैसे प्रकार a मुख्य में दिख रहा है? अगर मैं auto x= से a x= बदलता हूं तो यह स्पष्ट रूप से संकलित नहीं होता है, लेकिन a प्रकार के बारे में मुख्य कैसे पता चलता है?

static घोषणा तब से है जब मैं किसी और चीज की जांच करने की कोशिश कर रहा था लेकिन फिर मैंने इस व्यवहार पर ठोकर खाई।

इसे यहाँ चल रहा है: https://wandbox.org/permlink/rEZipLVpcZt7zm4j

+0

यह 'मजेदार' के रिटर्न प्रकार की वजह से जानता है जिसे 'संरचना ए' के ​​रूप में लिया जाता है। – nwp

+0

यदि मैं 'ऑटो x = 'से' x =' में बदलता हूं तो यह संकलित नहीं होता है, 'ऑटो' क्यों काम करता है? – PYA

+0

बेकउस कंपाइलर संकलित समय में लौटा चर घटा देगा ताकि वह जानता है कि यह 'संरचना' होगा। यदि आप 'x =' का उपयोग करते हैं, तो संकलक किसी अन्य दायरे में घोषित होने के कारण इस डेटाटाइप को नहीं जानता है। –

उत्तर

12

यह सब आश्चर्यजनक है जब तक आप इसे महसूस न करें: नाम दृश्यता प्रकार को छिपाती नहीं है। यह सिर्फ नाम नाम से छिपाता है। एक बार जब आप इसे समझ लेंगे तो यह सब समझ में आता है।

मैं सिर्फ सादे पुराने टेम्पलेट के साथ, auto बिना आप इस दिखा सकते हैं:

auto fun() 
{ 
    struct Hidden { int a; }; 

    return Hidden{24}; 
} 

template <class T> auto fun2(T param) 
{ 
    cout << param.a << endl; // OK 
} 

auto test() 
{ 
    fun2(fun()); // OK 
} 

तुम करीब से देखो, तो आप इस तुम्हारा के रूप में एक ही स्थिति है देखेंगे:

आप एक struct Hidden है जो fun पर स्थानीय है। तो फिर तुम test अंदर प्रकार Hidden की एक वस्तु का उपयोग करें: आप fun जो एक Hidden obj रिटर्न फोन और फिर आप fun2 जो बदले में सब पर कोई समस्या नहीं है यह महिमा सब में वस्तु Hidden का उपयोग करने के लिए इस वस्तु गुजरती हैं।

@Barry के रूप में सुझाव दिया गया है कि जब आप किसी वर्ग से किसी निजी प्रकार का उदाहरण लौटाते हैं तो वही होता है। तो हमारे पास C++ 03 के बाद से यह व्यवहार है। आप इसे स्वयं आज़मा सकते हैं।

+0

सी ++ 03 में एक ही चीज़ को एक निजी प्रकार के उदाहरण को लौटने वाली कक्षा के साथ भी पूरा कर सकता है। – Barry

+0

एक और उदाहरण लैम्बडास है, जिसका नाम कभी नहीं होता है, लेकिन अक्सर 'ऑपरेटर()' के साथ केवल structs होते हैं। – rustyx

1

सी ++ 14 अधिक से auto साथ अधिक सहिष्णु होना करने के लिए बनाया गया है। आपका प्रश्न स्पष्ट नहीं है, क्योंकि आप यह नहीं बता रहे हैं कि समस्या क्या है।

अब अपने प्रश्न से अलग तरीके से निपटें: यह a x = ... के साथ क्यों काम नहीं करता है?

कारण यह है कि संरचना परिभाषा मुख्य के दायरे में नहीं है। अब इस काम करेगा:

// Example program 
#include <iostream> 
#include <string> 
using namespace std; 

struct a 
{ 
    int num = 10; 
}; 

auto fun() 
{ 
    static a a_obj; 
    return a_obj; 
} 


int main() 
{ 
    a x = fun(); 
    cout << x.num << endl; 

} 

अब यहाँ इससे कोई फर्क नहीं पड़ता कि आप a या auto का उपयोग करें, क्योंकि amain() के लिए दिख रहा है। अब auto एक अलग कहानी है। संकलक पूछता है: क्या मेरे पास x का प्रकार क्या है (असंबद्ध रूप से) को कम करने के लिए पर्याप्त जानकारी है? और जवाब हां है, क्योंकि a का कोई विकल्प नहीं है।

+0

मुझे पता है कि आपका कोड क्यों काम करता है, मैं बस कुछ देखने के लिए परीक्षण कर रहा था जब एक स्ट्रक्चर एक स्ट्रक्चर में होता है, लेकिन तथ्य यह है कि 'ऑटो' अनुमान लगा सकता है कि मेरे लिए डरावना है :( – PYA

+1

@pyjg "अनुमान" गलत शब्द है। यह बिना किसी संदेह के जानता है या यह आपको एक त्रुटि देता है इसमें कोई अनुमान शामिल नहीं है। – nwp

+0

@pyjg वास्तव में मेरे लिए यह वीर है कि यह इसे C++ 98/03 में नहीं ढूंढ सका। क्यों नहीं? इस प्रकार का निर्णय लेने में बिल्कुल कोई अस्पष्टता नहीं है, तो संकलन त्रुटि क्यों बनाएं? यह सी ++ 14 में ऐसी लचीलापन पेश करने का दर्शन था। –

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