2010-01-23 19 views
5

जीसीसी समकक्ष के रूप में इन दोनों समारोह घोषणाओं व्यवहार करता है:स्थिरांक संकेत

void F(int* a) { } 
void F(int* const a) { } 

test.cpp: In function 'void F(int*)':

test.cpp:235: error: redefinition of 'void F(int*)'

test.cpp:234: error: 'void F(int*)' previously defined here

यह कुछ समझ में आता है क्योंकि एक फोन करने वाले हमेशा इस मामले में स्थिरांक अनदेखी करेंगे ... यह केवल उपयोग को प्रभावित करता है फ़ंक्शन के अंदर 'ए' पैरामीटर का।

मैं क्या सोच रहा हूं कि (यदि कहीं भी) मानक कहता है कि ओवरलोड रिज़ॉल्यूशन के उद्देश्य के लिए फ़ंक्शन तर्क के रूप में उपयोग किए गए पॉइंटर्स पर क्वालीफायर को छोड़ना विशेष रूप से ठीक है।

(मेरी असली मुद्दा यह है कि मैं यह पता लगाने के लिए करना चाहते हैं जहां जीसीसी इन व्यर्थ क्वालिफायर स्ट्रिप्स आंतरिक रूप से, और सी के बाद से ++ जीसीसी के दृश्यपटल मानक संदर्भित टिप्पणियों से अटे पड़े है, मानक के प्रासंगिक अनुभाग मुझे पाने में आपकी मदद कर सकता है । फोन करने वाले के लिए एक ही होने के नाते

void foo(int); 
void foo(const int); 

: सही स्थान)

+0

AFAIK यह सिर्फ पॉइंटर्स के लिए नहीं है। – Troubadour

उत्तर

4

स्टैंडर्ड 8.3.5/3 में कहा गया है कि समारोह प्रकार किसी भी सीवी-क्वालिफायर कि सीधे पैरामीटर प्रकार अर्हता निर्धारित करने के प्रयोजनों के लिए नष्ट हो जाती हैं। अर्थात। यह सचमुच का कहना है एक समारोह के रूप में घोषणा की कि

void foo(int *const a); 

समारोह प्रकार void (int *) है।

एक पंडिताऊ व्यक्ति का तर्क हो सकता है कि यह दावा करता है कि इसके बाद के संस्करण घोषणा इस एक

void foo(int *a) 
{ 
} 

तरह परिभाषा से मेल खाना चाहिए पर्याप्त निर्णायक नहीं है या यह दोहरी घोषणा के साथ कोड (बनाना चाहिए कि अपने उदाहरण के रूप में) खराब गठित, चूंकि इन अवधारणाओं में से कोई भी फ़ंक्शन प्रकार के संदर्भ में मानक में वर्णित नहीं है।

मेरा मतलब है, हम सभी जानते हैं कि इन const सभी बाहरी प्रयोजनों के लिए ध्यान नहीं दिया जा करने का इरादा कर रहे थे, लेकिन अब तक मैं मानक है कि अंतिम तौर राज्य करेगा कि वह वास्तव में शब्दों खोजने में असमर्थ था। शायद मुझे कुछ याद आया।

वास्तव में, 13.1/3 यह एक "नोट" कि का कहना है कि बराबर पैरामीटर घोषणाओं (के रूप में 8.3.5 में परिभाषित) के साथ समारोह घोषणाओं की घोषणा एक ही समारोह में। लेकिन यह सिर्फ एक नोट है, यह गैर-मानक है, जो बताता है कि मानक में कहीं भी एक ही मुद्दे पर कुछ मानक पाठ होना चाहिए।

+0

फ़ंक्शन में कॉन्स्ट के रूप में देखा जा सकता है धन्यवाद, 8.3.5/3 वही है जो मैं ढूंढ रहा था। –

+0

हम्म, ऐसा लगता है कि नोट 13/1 पर आधारित है, जो स्वीकार्य रूप से स्पष्ट रूप से स्पष्ट नहीं है, "विस्तार से, एक ही दायरे में दो घोषणाएं जो समान नाम घोषित करती हैं लेकिन विभिन्न प्रकारों के साथ ओवरलोडेड घोषणाएं कहा जाता है।" एक ही प्रकार के होने से उन्हें ओवरलोडेड घोषणाएं नहीं मिलती हैं। एक दूसरे के खिलाफ घोषणाओं से मेल खाने के लिए 13.2/1 कहता है "एक ही नाम की दो फ़ंक्शन घोषणाएं उसी कार्य को संदर्भित करती हैं यदि वे एक ही दायरे में हैं और समकक्ष पैरामीटर घोषणाएं हैं।", और "समकक्ष" को साफ़ करने के लिए पिछले नोट का संदर्भ देता है। –

+0

हालांकि यह अभ्यास सी मानक द्वारा भी किया जाता है। 'मुख्य' फ़ंक्शन परिभाषा कैसे दिखती है, इसका वर्णन करने के लिए, यह कहता है कि उन्हें "... या समकक्ष" की तरह घोषित किया जाना चाहिए, और एक फुटनोट कहता है कि इसका अर्थ क्या है (यानी 'char * []' के बजाय हम 'char' लिख सकते हैं ** ', और इसी तरह)। –

2

यह रूप में एक ही है। ऐसा इसलिए है क्योंकि फ़ंक्शन प्रति-मूल्य प्राप्त कर रहा है चाहे कोई फर्क नहीं पड़ता, इसलिए कॉलर को const के रूप में नहीं माना जाता है या नहीं; इससे कोई फर्क नहीं पड़ता।

यह ऐसी चीजों को अनदेखा करने के लिए संकलक के लिए कानूनी नहीं है, लेकिन अधिभार संकल्प में कोई अंतर नहीं है। const फ़ंक्शन के कार्यान्वयन पर लागू होता है।

अवैध हो सकता है अगर संकलक इलाज किया:

void foo(int i) 
{ 
    i = 5; // good 
} 

void foo(const int) 
{ 
    i = 5; // lolwut? 
} 

ही, const की अनदेखी करके।

1

मेरा मानना ​​है कि यह दूसरी तरफ है। किसी भी सूचक, यहां तक ​​कि nonconst, कांस्टे की तरह इलाज किया जा सकता है :)।

+0

मुझे लगता है कि आप 'int * const' को' const int * 'के साथ भ्रमित कर रहे हैं? यहां मुद्दा पॉइंटर की स्थिरता के साथ है। – Troubadour

+0

समस्या निवारण: मैंने देखा कि स्थिरता सूचक से संबंधित है। मेरा बिंदु कुछ भी (यहां तक ​​कि nonconst) को – Drakosha

3

मुझे लगता है कि यह मूल रूप से के रूप में इस के रूप में निषिद्ध है: गैर संदर्भों पर

void foo(int a) {} 
void foo(const int a) {} 

स्थिरांक अधिक भार में भाग नहीं लेता।

वास्तव में तुम भी

void foo(int a); 

घोषित कर सकता है और बाद में परिभाषित

void foo(const int a) {} 

जहां constness विशुद्ध रूप से एक कार्यान्वयन विस्तार जो फोन करने वाले के बारे में परवाह नहीं करता है।

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