एसटीडी :: फंक्शन कास्ट शुद्धता


11

मान लीजिए कि मेरे पास एक कॉल करने योग्य प्रकार है:

struct mutable_callable
{
    int my_mutable = 0;
    int operator()() { // Not const
        return my_mutable++;
    }
};

ध्यान दें कि mutable_callableएक गैर-कास्ट है operator()जो एक सदस्य चर को संशोधित करता है .....

अब मान लीजिए कि मैं std::functionअपने प्रकार का निर्माण करता हूं:

std::function<int()> foo = mutable_callable{};

अब मैं यह कर सकता हूं:

void invoke(std::function<int()> const& z)
{
    z();
}

int main()
{
    invoke(foo); // foo changed.....oops
}

अब जहाँ तक मैं बता सकता हूँ std::functionरों operator()है constके अनुसार: https://en.cppreference.com/w/cpp/utility/functional/function/operator ()

तो मेरी आंत महसूस कर रही है कि आपको ऐसा करने में सक्षम नहीं होना चाहिए ....।

लेकिन फिर देख रहे हैं: https://en.cppreference.com/w/cpp/utility/functional/function/function

यह कोई अड़चन नहीं है कि कॉल करने योग्य प्रकार में स्थिरांक है या नहीं operator()......

तो मेरा सवाल यह है: मैं यह मानने में सही हूं कि std::function<int()> const&मूल रूप से वही बात है क्योंकि std::function<int()>&दोनों के व्यवहार में वास्तव में कोई अंतर नहीं है ...... और अगर ऐसा है तो यह constसही क्यों नहीं है?


@MaxLanghof No ..... std::functionइसमें a के बराबर है struct a{ std::any x; };.....
DarthRubik

यहाँ MSVC std::functionकार्यान्वयन के आंतरिक लोगों का एक छोटा सा स्निपेट है : i.stack.imgur.com/eNenN.png जहाँ using _Ptrt = _Func_base<_Ret, _Types...>। बस इतना ही कहना चाहता हूं।
मैक्स लैंगहोफ

जवाबों:


3

यह उसी तरह उबलता है struct A { int* x; };, जहां आप एक के मूल्य को const A a;संशोधित कर सकते हैं (लेकिन जहां यह इंगित करता है)। इसमें (प्रकार के क्षरण से) अप्रत्यक्ष स्तर होता है जिसके माध्यम से प्रचार नहीं किया जाता है।*(a.x)std::functionconst

और नहीं, std::function<int()> const& fव्यर्थ नहीं है। एक में std::function<int()>& fआप के लिए एक अलग functor आवंटित करने के लिए सक्षम हो जाएगा f, जो आप में ऐसा नहीं कर सकते constमामले।


यूप ..... जो वास्तव में बहुत मायने रखता है ..... अभी भी पहली नज़र में भ्रामक है
डार्थरुबिक

मेरा मानना ​​है कि यह एक डिजाइन दोष है। यह अप्रत्यक्ष रूप से उपयोगकर्ता के लिए एक कार्यान्वयन विवरण पारदर्शी होना चाहिए, और कुछ मेटाप्रोग्रामिंग का उपयोग करके निरंतरता को प्रचारित किया जा सकता है।
इगोर आर।

@IgorR। हाँ, कब्ज का प्रचार किया जा सकता है। std::vectorयह std::unique_ptrनहीं करता है। मुझे लगता std::functionहै कि वास्तव में फ़नकार राज्य के आक्रमणकारियों को व्यक्त करने के बारे में नहीं है। हो सकता है कि हम std::function<int() const>भेद करने के लिए घृणित कार्य प्रकारों (यानी ) को पुन: पेश कर सकें ?
मैक्स लैंगहॉफ

unique_ptrकब्ज का प्रसार नहीं करना चाहिए, क्योंकि नियमित सूचक नहीं करता है। और std::function<int() const>संकलन नहीं करेगा।
इगोर आर।

@IgorR। मुझे पता है। मेरा कहना था कि मानक पुस्तकालय के कुछ हिस्से यह करते हैं और कुछ अन्य नहीं करते हैं। मुझे किस श्रेणी में std::functionआना चाहिए यह स्पष्ट नहीं है। और std::function<int() const>एक काल्पनिक था - निश्चित रूप से यह अब संकलित नहीं करता है, लेकिन क्या यह ओपी को यहां संतुष्ट करेगा यदि इसे वैध बनाया जा सकता है, यह व्यक्त करते हुए कि "केवल operator() const(या स्टेटलेस वाले) के साथ ही असाइन किए जा सकते हैं?" (भले ही उन दृश्यों के पीछे, जो घिनौने कार्य प्रकारों का उपयोग करने के कारण काफी अत्याचारी होंगे)?
मैक्स लैंगहॉफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.