c++ एक टेम्पलेट तर्क के लिए एक कॉन्स क्वालीफायर लागू करते समय विभिन्न कंपाइलर व्यवहार



templates gcc (1)

ऐसा लगता है कि आप मानक में एक दोष मारा है जिसे अभी तक हल नहीं किया गया है। तो जवाब "कौन सा कंपाइलर सही है?" वर्तमान में पूरी तरह स्पष्ट नहीं होगा।

समिति द्वारा इस मुद्दे को उठाया गया है और चर्चा की गई है:

यह स्पष्ट नहीं है कि निम्नलिखित अच्छी तरह से गठित है या नहीं:

void foo(){}

template<class T>
void deduce(const T*) { }

int main() {
  deduce(foo);
}

कार्यान्वयन इस उदाहरण के उनके उपचार में भिन्न होता है।

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584 देखें, लेकिन प्रस्तावित संकल्प N4141 या N4659 का हिस्सा नहीं है।

ध्यान दें कि आम तौर पर फ़ंक्शन प्रकारों को const करने के लिए पॉइंटर्स नहीं हो सकते हैं; यदि आप उदाहरण के बारे में सोचते हैं जो मैंने खराब गठित किया है, तो जीसीसी सही होगा। यह उदाहरण को अस्वीकार करता है और, ओपी में, गैर-कॉन्स संस्करण को केवल व्यवहार्य अधिभार के रूप में चुनता है।

अगर क्लैंग (जो प्रस्तावित संकल्प को लागू करने का दावा करता है ) अन्यथा सही होगा, मुझे यकीन नहीं है। मुझे लगता है कि समिति ने इस मुद्दे को हल करने के बाद उस चर्चा को फिर से देखना होगा जब हम कुछ मानक शब्द के साथ इस मुद्दे का समाधान कर सकते हैं।

तथापि,

सीडब्ल्यूजी की सर्वसम्मति यह थी कि तर्क और पैरामीटर की सीवी-योग्यता मेल खाना चाहिए, इसलिए मूल उदाहरण को खारिज कर दिया जाना चाहिए।

(कहा गया मुद्दा ध्यान दें) यह इंगित करता है कि जीसीसी सही है और इस मुद्दे को इसके व्यवहार के पक्ष में हल किया जाएगा।

https://code.i-harness.com

निम्नलिखित उदाहरण ( godbolt ) पर विचार करें:

#include <iostream>

template <typename T>
const T *as_const(T *p) { return p; }

void f() {}

template <typename T>
void g(T *) { std::cout << "A"; }

template <typename T>
void g(const T *) { std::cout << "B"; }

int main() {
  g(as_const(&f));
}

जीसीसी और क्लैंग दोनों इसे संकलित कर सकते हैं, लेकिन परिणामस्वरूप निष्पादन योग्य विभिन्न आउटपुट उत्पन्न करते हैं: जीसीसी प्रिंट A साथ संकलित संस्करण और क्लैंग प्रिंट्स B साथ संकलित एक।

क्या आप इस अंतर को समझा सकते हैं?

अपडेट करें : जैसा कि @ वीटीटी द्वारा इंगित किया गया है, वही अंतर देखा जाता है, भले ही as_const गिरा दिया गया हो।





const