2010-06-30 15 views
22

मैं एक समारोह है,सी ++ वेक्टर <int> के लिए डिफ़ॉल्ट तर्क?

void test(vector<int>& vec); 

मैं कैसे vec के लिए डिफ़ॉल्ट तर्क सेट कर सकते हैं? "करने के लिए 'std :: वेक्टर < _Ty> &' 'std :: वेक्टर < _Ty>' से रूपांतरण गैरमानक विस्तार के लिए इस्तेमाल किया: 'डिफ़ॉल्ट तर्क'"

मैं

void test(vector<int>& vec = vector<int>()); 

की कोशिश की है लेकिन वहाँ एक चेतावनी है

क्या ऐसा करने का कोई बेहतर तरीका है?

void test(const vector<int>& vec = vector<int>()); 

C++ temporaries गैर स्थिरांक संदर्भ बाध्य होने के लिए अनुमति नहीं देता: इसके बजाय

void test() { 
    vector<int> dummy; 
    test(dummy); 
} 

सादर की, Voteforpedro

उत्तर

43

आप कोशिश की है।

यदि आपको वास्तव में vector<int>& (const एक नहीं) की आवश्यकता है, तो आप एक स्थिर उदाहरण घोषित कर सकते हैं और इसे डिफ़ॉल्ट (इस प्रकार गैर-अस्थायी) मान के रूप में उपयोग कर सकते हैं।

static vector<int> DEFAULT_VECTOR; 

void test(vector<int>& vec = DEFAULT_VECTOR); 

लेकिन सावधान रहना, क्योंकि DEFAULT_VECTOR संशोधित किया जा (कर सकते हैं) होगा और प्रत्येक कॉल पर रीसेट नहीं होगा! सुनिश्चित नहीं है कि यह वही है जो आप वास्तव में चाहते हैं।

एक डिफ़ॉल्ट मान प्रदान करने के बजाय, आप के रूप में अच्छी जो दूसरे संस्करण कॉल एक शून्य पैरामीटर संस्करण के साथ test() ओवरलोड हो सकता है:: stinky472 को


धन्यवाद, यहाँ एक धागा सुरक्षित विकल्प है

void test() 
{ 
    vector<int> vec; 
    test(vec); 
} 
+4

+1 लेकिन मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि 'परीक्षण' आमतौर पर थ्रेड-सुरक्षित नहीं होगा, यह 'DEFAULT_VECTOR' को संशोधित करना था। यह कठिन हो सकता है, लेकिन मैं दृढ़ता से ऐसी आवश्यकताओं के लिए दो कार्यों को लिखने की सिफारिश करता हूं (कोई अन्य का पुन: उपयोग कर सकता है): शून्य परीक्षण() {वेक्टर temp; परीक्षण (अस्थायी); } – stinky472

+0

@ stinky472: धन्यवाद, मेरा जवाब अपडेट किया गया। – ereOn

+1

एक साइड नोट के रूप में, अस्थायी के संदर्भ प्राप्त करने का एक हैकी तरीका है यदि आप बाद में कुछ विधि का उपयोग कर सकते हैं जो स्वयं के लिए ऐसा संदर्भ देता है ... उदा। 'ऑपरेटर ='। तो, 'शून्य परीक्षण (वेक्टर और वीसी = वेक्टर ()। ऑपरेटर = (वेक्टर ()); 'काम करना चाहिए (अस्थायी जीवनकाल यहां अप्रभावित है और कॉल को संभालने के लिए पर्याप्त रहेगा)। लेकिन कृपया यह मत करो :) –

7

मुझे डिफ़ॉल्ट मान रखने के लिए गैर-const संदर्भ तर्क के लिए यह संदिग्ध लगता है। इसका क्या मतलब है?

आम तौर पर, एक गैर-const संदर्भ लेने वाला फ़ंक्शन का अर्थ है "मैं तर्क बदल सकता हूं"। यदि तर्क वैकल्पिक क्यों नहीं है (गैर- const) सूचक? इस तरह, जब कॉलर्स एक तर्क पारित नहीं करना चाहते हैं, तो वे NULL पास कर सकते हैं।
(here देखें कि समारोह तर्क पारित करने के लिए अधिक जानकारी के लिए।)

संपादित करें: ठीक है, और निश्चित रूप से, वहाँ भी है अधिक भार। बस एक और अधिभार जोड़ें जो इस तर्क को नहीं लेता है।

+0

आप इसे संदिग्ध पाते हैं? – Puppy

+3

@DeadMG: क्या आप मेरी टूटी हुई व्याकरण उप-प्रणाली का जिक्र कर रहे हैं? – sbi

+1

क्या मैं ऐसा कुछ करूंगा? – Puppy

3

हम अस्थायी संदर्भों को परिवर्तनीय संदर्भ प्रारंभ नहीं कर सकते हैं। केवल कॉन्स संदर्भ इस अनुमति देते हैं।क्या आप के बाद कर रहे हैं सबसे अधिक संभावना यह है:

void test(const vector<int>& vec = vector<int>()); 

एक तरफ अपरिभाषित व्यवहार से बचने के अलावा, यह सबसे अधिक उपयुक्त तार्किक और एक स्थिरांक-शुद्धता नजरिए से बना देता है। यदि आप मूल वेक्टर को पारित करने के लिए 'परीक्षण' चाहते थे, तो आप समझदारी से डिफ़ॉल्ट मान प्रदान करने में सक्षम नहीं होते। इस प्रकार यह स्पष्ट है कि आप केवल पढ़ने के उद्देश्यों के लिए 'vec' का उपयोग कर रहे हैं और इसलिए इसे एक कॉन्स्ट संदर्भ बनाना चाहिए।

+2

आप सीधे अस्थायी संदर्भों को अस्थायी संदर्भों को प्रारंभ नहीं कर सकते हैं। अस्थायी कोई संदर्भ-से-गैर-कॉन्स्टेंस से बंधे नहीं होगा - यदि आप इसे आज़माते हैं, तो यह यूबी नहीं है, यह खराब गठित इनपुट है (यानी कंपाइलर त्रुटि)। वीसी ++ आपको ऐसा करने देता है, लेकिन सही मायने में नोट करता है कि यह एक भाषा विस्तार है। –

+0

@ पावेल आह अच्छा बिंदु! मैंने गंदे कंपाइलर्स को देखा है जिन्होंने इस व्यवहार को एमएसवीसी और कोडवायरियर के पिछले संस्करणों की अनुमति दी, जहां कोड बनाया गया लेकिन दुर्घटनाग्रस्त हो गया। मैं सटीकता के लिए तदनुसार पोस्ट को संशोधित करूंगा। इस पर ध्यान दिलाने के लिए धन्यवाद। – stinky472

-1

मैं जानता हूँ कि इस सवाल का 2010 में कहा गया था लेकिन सी ++ 11 आप इसे इस तरह से कर सकते हैं के लिए:

void test(vector<int>& vec = {}) { 
     // Awesome code here 
} 

रूप this answer में बताया।

+0

इसका वही अर्थ है 'शून्य परीक्षण (वेक्टर और वीसी = वेक्टर ()); जैसा कि सवाल में है, जो एक अस्थायी संदर्भ के लिए अस्थायी बांधने का प्रयास करने के कारण अवैध है। उत्तर में आप लिंक करते हैं, यह एक संदर्भ नहीं है। –

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