स्पान कॉन्स्टैक्स हो सकता है?


11

Std के सभी कंस्ट्रक्टर :: स्पैन को कॉन्स्टैक्स घोषित किया गया है, हालाँकि मुझे लगता है कि उनमें से किसी को भी कॉन्स्ट्रेक्स के संदर्भ में काम करने की जरूरत नहीं है। नीचे दिए गए किसी भी कमी को पूरा करने के परिणामस्वरूप संकलन त्रुटि हो जाएगी।

#include <array>
#include <span>

int main()
{
    constexpr int carray[3] = { 0, 1, 2 };
    constexpr std::array<int, 3> array{ 0, 1, 2 };
    using S = std::span<const int, 3>;

    /*constexpr*/ S span1{ array.data(), 3 };
    /*constexpr*/ S span2{array.begin(), array.end()};
    /*constexpr*/ S span3{carray};
    /*constexpr*/ S span4{array};
}

क्या वास्तव में एक कॉन्स्ट्रेक्स स्पैन प्रकार बनाना संभव है, क्योंकि ऐसा लगता है कि कंस्ट्रक्टरों का कभी भी संकलन समय पर मूल्यांकन नहीं किया जा सकता है जब उन्हें एक पॉइंटर या संदर्भ को इनिशियलाइज़ करना है?


कमियों को हटाएं उन्हें हटा न दें।
एंड्रियास लोंजोए

आप एक क्रम अवधि की शुरुआत कर रहे हैं जिसका अर्थ है कि मैं एक कॉन्स्ट्रेक्स स्पैन को शुरू करने के लिए हूं
एंड्रियास लोन्जो

रवींद्र। निश्चित नहीं कि मैंने ऐसा क्यों किया। कोई बात नहीं
नाथनऑलवर

अजीब है, यह नहीं देखना चाहिए कि यह अवधि केवल स्थानीय दायरे के अंदर ही क्यों रहती है ...
एंड्रियास लोन्जोई

बारीकी से संबंधित: stackoverflow.com/q/57545503/2069064
बैरी

जवाबों:


13

आप इस तरह एक स्थिर अभिव्यक्ति में गैर-स्थिर फ़ंक्शन स्थानीय चर का उपयोग नहीं कर सकते। आपको पता स्थिरता की आवश्यकता है और यह केवल स्थैतिक वस्तुओं द्वारा प्राप्त किया गया है। को कोड संशोधित करना

constexpr std::array<int, 3> array{ 0, 1, 2 };
constexpr int carray[3] = { 0, 1, 2 };

int main()
{
    using S = std::span<const int, 3>;

    constexpr S span1{ array.data(), 3 };
    constexpr S span2{array.begin(), array.end()};
    constexpr S span3{carray};
    constexpr S span4{array};
}

या

int main()
{
    static constexpr std::array<int, 3> array{ 0, 1, 2 };
    static constexpr int carray[3] = { 0, 1, 2 };
    using S = std::span<const int, 3>;

    constexpr S span1{ array.data(), 3 };
    constexpr S span2{array.begin(), array.end()};
    constexpr S span3{carray};
    constexpr S span4{array};
}

आपको एक बनाने की अनुमति देता है constexpr std::span


5
स्कोप समस्या नहीं है। भंडारण अवधि है। स्थैतिक स्थानीय काम करना चाहिए।
एरोरिका

यह भी काम करता है अगर सभी एक constexprसमारोह के भीतर (स्पष्ट बिना static) स्थानीय वस्तुएं हैं । क्या ऐसी वस्तुओं में डिफ़ॉल्ट स्थिर भंडारण अवधि है या यह कुछ अलग है?
193 में n314159

@ n314159 मुझे यकीन नहीं है कि अगर इसकी अनुमति दी गई है या यदि आप खूंखार हो गए हैं: यदि किसी कॉन्स्ट्रेक्स फ़ंक्शन की कोई विशेषज्ञता नहीं है, तो एक निरंतर स्थिर अभिव्यक्ति है कि फ़ंक्शन बीमार है, कोई नैदानिक ​​आवश्यक क्लॉज नहीं है। [expr.const] / 10 केवल स्थिर चर की अनुमति देता है।
नाथनऑलिवर

@ n314159: मुझे यकीन नहीं है कि आप जो काम कर रहे हैं (या "काम करता है"), लेकिन किसी फ़ंक्शन (स्थिर या नहीं) में स्थिर अभिव्यक्ति के रूप में कुछ का उपयोग करने और एक निरंतर निर्माण के लिए कुछ का उपयोग करने के बीच के अंतर से सावधान रहें एक constexpr फ़ंक्शन के माध्यम से अभिव्यक्ति ।
डेविस हेरिंग 1

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