2014-09-04 9 views
16

संपादित करें: अंतिम लक्ष्य: मैं एक कंटेनर क्लास बनाना चाहता हूं जो कभी भी उपलब्ध होने पर भी चाल का उपयोग न करे। NonMove उस कंटेनर के लिए परीक्षण वस्तुओं का एक वर्ग है।मैं एक गैर-चलने योग्य (लेकिन कॉपी करने योग्य) ऑब्जेक्ट कैसे वापस कर सकता हूं?

मैंने विभिन्न बदलावों की कोशिश की, लेकिन जीसीसी ने कदम का उपयोग करने के लिए जोर दिया।

class NonMove { 
public: 
    NonMove() {} 

    // Copy. 
    NonMove(const NonMove&) {} 
    NonMove& operator=(const NonMove&) {} 

    // Move 
    NonMove(NonMove&&) = delete; 
    NonMove& operator=(NonMove&&) = delete; 
}; 

NonMove foo() { 
    return NonMove(); 
} 

-std = GNU ++ 11

move.cc: In function ‘NonMove foo()’: 
move.cc:15:18: error: use of deleted function ‘NonMove::NonMove(NonMove&&)’ 
    return NonMove(); 
       ^
move.cc:10:3: note: declared here 
    NonMove(NonMove&&) = delete; 
^
+9

स्पष्ट रूप से नष्ट कर दिया चाल कंस्ट्रक्टर्स अधिभार संकल्प में भाग लेते हैं। यदि आप इसे कॉपी करना चाहते हैं और स्थानांतरित नहीं करना चाहते हैं, तो प्रतिलिपि ctor घोषित करें, चाल ctor घोषित न करें, और कोई चाल ctor उत्पन्न नहीं किया जाएगा। 'ऑपरेटर =' के लिए डितो। –

+0

'NonMove (NonMove &&) = हटाएं हटाएं; ', कक्षा वैसे भी गैर-चलने योग्य-प्रतिलिपि होगी। – juanchopanza

+2

क्या आपके पास चालन संचालन को हटाने का एक अच्छा कारण है? एक प्रतिलिपि कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर घोषित करने से उन्हें किसी भी अवांछित अधिभार को पेश किए बिना उत्पन्न होने से रोका जा सकता है। (दूसरे शब्दों में, कक्षा चल हो जाएगा, आंदोलन नकल के रूप में ही है। आपका वर्ग पूरी तरह से unmovable इसे स्थानांतरित करने के जरूरत पड़ने पर विफलता है, इसलिए।) –

उत्तर

14

अंत लक्ष्य के साथ जीसीसी 4.9.1 के साथ त्रुटि: मैं एक कंटेनर वर्ग है कि कभी नहीं [कदम] का उपयोग करता है बनाना चाहते हैं, भले ही यह है उपलब्ध। NonMove उस कंटेनर के लिए परीक्षण वस्तुओं का एक वर्ग है।

आपका वर्ग जरूरी मदद नहीं करता है, अपने लक्ष्य को प्राप्त क्योंकि इस कदम निर्माता को हटाने प्रकार का क्या मतलब CopyConstructible नहीं है, इसलिए सही रूप में एक कंटेनर है कि केवल प्रतियां परीक्षण करने के लिए इस्तेमाल नहीं किया जा सकता है।

आप सुनिश्चित कर सकते है कि सभी संभावित प्रतियां या चाल एक स्थिरांक स्रोत ऑब्जेक्ट के साथ किया जाता है आगे बढ़ रोकने के लिए: अगर आरएचएस const है

NonMove foo() { 
    return const_cast<const NonMove&&>(NonMove()); 
} 

चाल निर्माता व्यवहार्य नहीं है।

यह सुनिश्चित करने के लिए आमतौर पर पर्याप्त है कि आरएचएस एक अंतराल है, क्योंकि इसे या तो स्थानांतरित नहीं किया जाएगा, लेकिन फ़ंक्शन रिटर्न मानों के लिए एक विशेष मामला है, जिसे वे अंतराल के बावजूद स्थानांतरित कर सकते हैं, जिसका अर्थ है कि यह कोशिश करेगा इस कदम निर्माता का उपयोग करने के यदि वह मौजूद है:

NonMove foo() { 
    NonMove nm; 
    return nm; 
} 

जोड़ना const सुनिश्चित करता है यह बजाय कॉपी किए जाएंगे:

NonMove foo() { 
    NonMove nm; 
    return const_cast<const NonMove&>(nm); 
} 
संबंधित मुद्दे