2016-10-05 8 views
7

मान लीजिए इस तरह एक समारोह है ले जाया गया:std :: move- प्रोग्रामर चेतावनी देने के लिए कैसे उपयोग करने के लिए नहीं * से * वस्तु

int * func() 
{ 
    std::unique_ptr<int> ptr(new int(3)); 
    //Few more lines of code 

    //then one function added where programmer writes like some thing 

    SOME_OTHER_FUNC(std::move(ptr)); 

    return ptr.get(); 
} 



void SOME_OTHER_FUNC(std::unique_ptr<int> arg_ptr) 
{ 
} 

वहाँ प्रोग्रामर चेतावनी देने के लिए std::move के साथ इस तरह गलतियों से बचने के लिए एक रास्ता है? यह केवल unique_ptr के बारे में नहीं बल्कि अन्य वस्तुओं के लिए भी है।

क्या हम स्थानांतरित किए गए ऑब्जेक्ट से अनुपयुक्त होने पर चेतावनी उत्पन्न करने के लिए कोई तंत्र है?

+0

सुनिश्चित नहीं है कि डुप्लिकेट है लेकिन विषयानुसार बंद करें: http://stackoverflow.com/questions/39413502/why-should-a-move-constructor-or-move-assignment-operator-clear-its-argument/39413587# 3 9 413587 – Hayt

+1

मैं उम्मीद करता हूं कि कंपाइलर लेखकों ने किसी भी चीज के उपयोग के लिए चेतावनी का आविष्कार किया है, जैसे कि 'std :: move''। यदि यह आपको पर्याप्त दर्द देता है, तो अपने कंपाइलर के लेखक को पैच सबमिट करने पर विचार करें! –

+0

@TobySpeight मुझे संदेह है कि ऐसी चेतावनी पेश की जाएगी। प्रकार कन्स्ट्रक्टर/असाइनमेंट ऑपरेटरों को स्थानांतरित कर सकते हैं जो मूल को आंशिक रूप से निर्दिष्ट करते हैं (आंशिक रूप से, या यहां तक ​​कि पूरी तरह से) निर्दिष्ट राज्य और निश्चित (शायद यहां तक ​​कि सभी) परिचालनों में अच्छी तरह परिभाषित व्यवहार होगा। संकलक कैसे पता लगा सकता है कि वस्तु से स्थानांतरित करने का उपयोग अनजान था? – user2079303

उत्तर

15

std::move चेतावनी है। यदि आपके प्रोग्रामर इसे समझ में नहीं आते हैं, तो आपको उन्हें बेहतर तरीके से शिक्षित करना होगा। यदि फ़ंक्शन इतना लंबा है कि प्रोग्रामर उचित रूप से इस कदम को अनदेखा कर सकता है, तो इसे कम करने के लिए आपको अपने फ़ंक्शन को दोबारा करने की आवश्यकता है।

+2

या, परिवर्तनीय से 'move''d के दायरे को सीमित करें, इसलिए इसका जीवनकाल समाप्त होने और शुरू होने के ठीक बाद यह ठीक है। – Yakk

+1

"*' std :: move' चेतावनी है। * "क्या कहा जाता है कि समिति को यह सुनिश्चित करने के लिए * std :: move' का उपयोग करने के लिए * बल * के लिए बहुत बड़ी परेशानी होती है ताकि यह सुनिश्चित हो सके कि यह स्पष्ट होगा कोड को पढ़ने वाले प्रत्येक व्यक्ति को ऑब्जेक्ट से स्थानांतरित कर दिया गया है। और कुछ लोग अभी भी इसे प्राप्त नहीं करते हैं। –

+1

@ निकोलबोलस हर कोई जानता है कि 'std :: move' नहीं चलता है, और' std :: forward' आगे नहीं बढ़ता है। – Yakk

0

स्रोत कोड के भीतर हर समस्या को हल या हल नहीं किया जा सकता है।

  1. unique_ptr का उपयोग एक कार्यान्वयन विस्तार है; इसे encapsulate।

  2. फ़ंक्शन के लिए पूर्व और पोस्ट स्थितियों को निर्दिष्ट करें और परीक्षणों का उपयोग करें।

+3

हर समस्या को अमूर्तता से हल नहीं किया जाता है। तथ्य यह है कि आपके संसाधन को स्थानांतरित किया जा सकता है और बाद में अमान्य हो जाता है, जिसे अमूर्तता से हल नहीं किया जा सकता है। सही परीक्षण और परीक्षण कवरेज सब कुछ हल करता है जिस तरह से सही कोड लिखना सबकुछ हल करता है। अधिक सही परीक्षण और अधिक सही कोड चीजों को बेहतर बनाते हैं, लेकिन "इसे कवर करने के लिए परीक्षण लिखें" कहने के रूप में उपयोगी है "इसे पहले स्थान पर न करें"। – Yakk

+0

आप पूर्व और पोस्ट की स्थितियों के बिंदु से चूक गए। – knivil

0

यह संकलक मदद करने के लिए अच्छा होगा, ऐसा नहीं है? वहाँ अच्छे कारणों के रूप में आप सोच सकते हैं के रूप में सरल नहीं हैं:

  1. std::move() जादू नहीं है, और आप अपने खुद की एक समान कार्य लिख सकते हैं। कंपाइलर कैसे जानता होगा कि आपके नए फ़ंक्शन का इलाज उसी तरह किया जाना चाहिए? आपको एक मानक विशेषता की आवश्यकता होगी जिसके साथ फ़ंक्शन को सजाने के लिए। यदि आप सटीक फ़ंक्शन std::move पर विशिष्ट चेतावनी देते हैं, तो आप मानक लाइब्रेरी के ज्ञान को भाषा संकलक में एन्कोड करते हैं।
  2. हालांकि सामान्य में , एक ले जाया गया-से वस्तु केवल को सौंपा जा सकता है या विलुप्त, कुछ कक्षाओं के बारे में मजबूत गारंटी दे सकता है ले जाया गया-से राज्य (उदाहरण के लिए, एक कंटेनर एक वैध खाली संग्रह जब बनने के रूप में दस्तावेज किया जा सकता है से चले गए)। आप संकलक को कैसे बता सकते हैं कि कौन से ऑपरेशंस विशिष्ट स्थानांतरित वस्तुओं पर सुरक्षित हैं?

¹ जवाबी तर्क: compilers पहले से ही, निश्चित रूप से कुछ इसी तरह, करते हैं जब कार्यों का std::printf() और std::scanf() परिवारों के लिए प्रारूप तार मान्य।

संबंधित मुद्दे