कॉन्सेप्ट टीएस चेक निजी एक्सेस संशोधक की उपेक्षा करता है


10

मैं एक अवधारणा अनुक्रमणिका लिखना चाहता हूं जिसका अर्थ है कि एक अनुक्रम या तो शुरू / समाप्त हो गया है जो रैंडम एसेटइंटरेटर, या ऑपरेटर को लौटाता है [] परिभाषित है और गैर-शून्य प्रकार का मान लौटाता है।

मैंने अनुक्रम अवधारणा के लिए स्ट्रॉस्ट्रुप के लेख से विचारों का उपयोग किया और इसके साथ संवर्धित किया:

template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
    { t[n] } -> NotVoid;
};

यह ज्यादातर मामलों पर काम करता है लेकिन निम्नलिखित पर विफल रहता है:

struct Bad {
    std::vector<int> nums;

private:
    int& operator[](size_t ind) {
        return nums[ind];
    }
};

static_assert(!Indexable<Bad>, "fail");

किसी कारण से मेरी अवधारणा इस तथ्य को नजरअंदाज कर देती है कि ऑपरेटर [] निजी परिभाषित है और सही है। मैं क्या खो रहा हूँ?


1
रुचि से बाहर, आप अभ्यास में अपनी अवधारणा का उपयोग कैसे करेंगे Indexable? चूंकि यह एक समान इंटरफ़ेस की गारंटी नहीं देता है, इसलिए कोड का उपयोग करके इसे अभी भी begin(x)[i]या तो अस्तित्व में लाने की आवश्यकता होगी x[i]
कोनराड रुडोल्फ

यह बिना किसी व्यावहारिक अनुप्रयोगों के एक अकादमिक असाइनमेंट है।
magom001

1
ऐसा नहीं लगता है: "एक्सेस चेकिंग प्रतिस्थापन प्रक्रिया के भाग के रूप में की जाती है" eel.is/c++draft/temp#deduct-8.note-1
LF

आप किस कंपाइलर का उपयोग कर रहे हैं? जीसीसी ट्रंक लगता है काम ठीक godbolt.org/z/hY6UvYstatic_assert निजी के लिए गुजरता है operator[]और जनता के लिए विफल रहता है।
सेब्रुक

concept boolइंगित करता है कि आप अवधारणाओं टीएस के खिलाफ संकलन कर रहे हैं, न कि सी ++ 20 अवधारणाएं। दोनों के बीच के नियम अलग हो सकते हैं।
अखरोट

जवाबों:


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