यह तब तक काम कर सकता है जब तक आपकी कक्षा में सार्वजनिक डेटा सदस्य न हों।
असल में, विचार रैपर के निर्माण को प्रतिबंधित नहीं करना है, लेकिन यह सुनिश्चित करने के लिए कि उदाहरण (जैसा कि आपने कहा था) केवल तभी अस्थायी मान हो।सभी विधियों को हटाने और हटाने (या उन्हें निजी बनाने) को ओवरलोड करके इसे प्राप्त कर सकते हैं जो कि & को संदर्भित करते हैं।
class Wrapper
{
public:
Wrapper() = default;
Wrapper(const std::string& name) : name(name) {}
void process() && { std::cout << "Greetings from " << name << std::endl; }
// Only temporary instances of this class are allowed!
void process() const & = delete;
private:
std::string name;
};
और कुछ उपयोग के मामलों:
Wrapper("John").process(); // intended use case
Wrapper j; // create whatever you want
j.process(); // error C2280: 'void Wrapper::process(void) const &': attempting to reference a deleted function
std::move(j).process(); // this is still possible
const Wrapper& t = Wrapper(); // bind the temporary to a const reference - not a problem because ...
t.process(); // error C2280: 'void Wrapper::process(void) const &': attempting to reference a deleted function
स्पष्ट नुकसान कर रहे हैं:
- आप ओवरलोड हर सार्वजनिक सदस्य कार्य हो
यहाँ एक सरल उदाहरण है।
- त्रुटि संदेश में देरी हो रही है और बहुत जानकारीपूर्ण नहीं है।
मानक में एक समान बात की गई है। Std :: context_wrapper do not accept temporaries के लिए मेक रूटीन।
नोट है कि वे एक और सूक्ष्मता माना: अधिभार स्थिरांक टी & & बजाय टी & & उपयोग करता है। यह हमारे मामले में भी महत्वपूर्ण हो सकता है। उदाहरण के लिए, यदि आपके आवरण जानबूझकर और noncopyable डिज़ाइन किया गया है आप इस तरह के
const Wrapper make_wrapper();
बजाय
Wrapper make_wrapper();
इस मामले में के रूप में दिनचर्या बनाने का उपयोग करें, आप को बदलने के लिए चाहते हो सकता है
void process() &&;
void process() const &&;
क्या आप एम ईन केवल ढेर के बजाय ढेर पर उदाहरण बनाने की इजाजत देता है? –
नहीं, केवल अस्थायी के रूप में। स्टैक –
पर ऐसे उदाहरण बनाने के लिए अभी भी खतरनाक है कभी-कभी सबसे अच्छा निवारक दस्तावेज़ में "एक्स न करें" की टिप्पणी है। –