std :: is_constructible निजी कंस्ट्रक्टर के लिए असंगत मूल्य देता है


13

ऐसे कौन से नियम हैं जिनके द्वारा std::is_constructibleनिजी निर्माणकर्ता को संभालते हैं? निम्नलिखित कोड दिया गया है:

#include <iostream>

class Class {
private:
    Class() { }
};

template <typename T>
class Test {
public:
    static void test() {
        std::cout
            //<< std::is_constructible<Class>::value
            << std::is_constructible<T>::value
            << std::endl;
    }
};

int main() {
    Test<Class>::test();
}

यह प्रिंट 0( ideone ), यानी, Tडिफ़ॉल्ट रूप से रचनात्मक नहीं है।

टिप्पणी की गई रेखा को हटाकर , यह प्रिंट करता है 11( आइडोन ), इसलिए अचानकT निर्माण डिफ़ॉल्ट हो जाता है।

मुझे दोनों परिणामों का समर्थन करने का तर्क मिल सकता है, लेकिन मुझे समझ नहीं आ रहा है कि टिप्पणी की गई पंक्ति सहित दूसरे के परिणाम को कैसे बदला जाए। क्या यह किसी तरह यूबी का आह्वान कर रहा है? क्या यह एक कंपाइलर बग है? या std::is_constructibleवास्तव में यह असंगत है?


1
एक GCC बग की तरह दिखता है, 9 प्रिंट्स00
क्लार्क

1
एक और अजीब लगता है कि जब मैं c ++ 17 g ++ 9.2.1 / g ++ - 10.0 के साथ अपनी मशीन पर संकलन कर रहा हूं, तो ध्यान दें कि std :: is_constructible <...> :: value with is_constructible_v <...>, वह है। परिणाम बदल जाता है 00
उत्परिवर्ती

1
@mutableVoid वास्तव में - और ऐसा लगता है कि ::valueसंस्करण इससे पहले आने वाले लोगों के आउटपुट को बदलने में भी सक्षम है: Godbolt.org/z/zCy5xU टिप्पणी लाइन को अनकम्फर्ट करें और सभी gcc में 1: s हो जाए।
टेड लिंगमो

1
इसे ठीक करने का एक और तरीका: godbolt.org/z/EKaP3r तो मूल रूप से यह कुछ प्रकार का मूल्यांकन आदेश बग है।
मारेक आर

2
@mutableVoid आपको इसे सच होने के लिए फ़ंक्शन टेम्प्लेट को तत्काल करने की आवश्यकता नहीं है। इस उदाहरण में, यह लौटता है, falseलेकिन यदि फ़ंक्शन टेम्प्लेट अनियंत्रित है , तो यह अचानक वापस आ जाता है true: godbolt.org/z/zqxdk2
टेड लिंगमो

जवाबों:


3

std::is_constructiblefalseइस परिदृश्य में लौटना चाहिए क्योंकि निर्माणकर्ता सुलभ नहीं है।

जैसा कि प्रश्न के नीचे कहा गया है, प्रश्न में वर्णित व्यवहार GCC / libstdc ++ में बग के कारण होता है। बग यहां बताया गया है , और, बगज़िल्ला के अनुसार, यदि संबंधित टेम्पलेट फ़ंक्शंस में कक्षाओं के लिए एक्सेस कंट्रोल बग के कारण नहीं है, जो काफी समय से अनसुलझे हैं। दो बगों के बीच संबंध जोनाथन वेक्ली के बुग्जिला टिप्पणी से लिया गया है, जो पहले दो बगों के बीच संबंध का पता लगाता है।

यह भी इस तथ्य से निहित है कि जीसीसी में इस परिदृश्य का व्यवहार सही हो जाता है जब निर्माणकर्ता को निजी बनाने के बजाय हटा दिया जाता है:

class Class {
    Class() = delete;
};

जो प्रिंट बाहर 0और 00क्रमशः। यह सही आउटपुट है (जो clangकि निजी कंस्ट्रक्टर के साथ परिदृश्य में सही रिपोर्ट करता है)।

यह समझा सकता है व्यवहार की प्रेक्षित परिवर्तन जब लाइन में टिप्पणी करते हुए क्योंकि में समारोह के अंदर टेम्प्लेट की struct, पहुँच जाँच काम नहीं करता है और रिपोर्ट है कि निर्माता पहुँचा जा सकता है जब यह नहीं है। जब अगली पंक्ति में या फिर पूरी तरह से अलग स्थान पर (जैसा कि यहाँ मामला है ) पर फिर से विशेषता की जाँच की जाती है , तो यह पहले से ही तात्कालिक हो गया है, और इस प्रकार गलत उत्तर देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.