2016-03-07 12 views
8

तरीके में एल मूल्य इन्स्टेन्शियशन बता सकते हैं कि वे एक एल मूल्य या एक आर-मूल्य पर कहा जाता है:रोकथाम सी ++ 14 में सी ++ 14

struct A{ 
    A() { puts("Ctor"); } 
    void m() const & { puts("L-value"); } 
    void m() const && { puts("R-value"); } 
}; 

int main(){ 
    A a; //Ctor 
    a.m() //L-value 
    A().m(); //Ctor; R-value 
} 

एक ctor बता सकते हैं जो प्रकार यह निर्माण कर रहा है? क्या मैं अपनी कक्षा से एल-वैल्यू के निर्माण को पूरी तरह अक्षम कर सकता हूं?

मेरे पास प्रॉक्सी क्लास (कई, वास्तव में) है, जो हमेशा किसी और चीज में परिवर्तित होना चाहिए। कनवर्ट किए बिना इसका उपयोग करना एक त्रुटि है। मैं रनटाइम पर उस त्रुटि का पता लगा सकता हूं, उदाहरण के लिए, bool used_ = 0; सदस्य #ifndef NDEBUG; सदस्य और इसे मेरे उपयोगकर्ता द्वारा निर्दिष्ट कलाकार में सेट करके, और फिर प्रॉक्सी क्लास के Dtor में assert(used_) कर कर, हालांकि यह बहुत अच्छा होगा अगर मैं संकलक को रोकने के लिए संकलक प्राप्त कर सकता हूं पहली जगह में है कि प्रॉक्सी के L-value उदाहरणों में से instatiation:

auto x = Proxy().method1().method2(); // no 
Proxy p; // no 
Target x = Proxy(); //yes 
Target x = Proxy().method1().method2(); //yes 

मुझे लगता है कि सी ++ 14 के साथ की तरह कुछ कर सकता हूँ?

+6

जो भी आप चाहते हैं उसे हासिल करने के लिए पुराने स्कूल का तरीका निजी रूप से कन्स्ट्रक्टर को सेट करना है और केवल स्थिर तरीकों के माध्यम से निर्माण की अनुमति देना है। मुझे लगता है कि आपके कोड के साथ काम करने वाले व्यक्ति के लिए भी अधिक सहज होगा। – ypnos

+1

'ऑटो और एक्स = प्रॉक्सी(); 'आईआईआरसी को रोका नहीं जा सकता है। और फिर 'x' एक संशोधित lvalue प्रॉक्सी है। – dyp

+0

मुझे लगता है कि उत्तर अभी भी नहीं है और आपको ऐसा करना है जो ypnos – NathanOliver

उत्तर

2

क्यों, निश्चित रूप से:

#include <iostream> 
using namespace std; 

class B; 

class A 
{ 
public: 
    A(B&& b) {} 

    A(const B&) = delete; 
}; 

class B {}; 

int main() 
{ 
    B b; 

    // A a1; <- error 
    // A a2 = b; // <- error 
    A a3 = move(b); // <- fine 

    return 0; 
} 
+0

सुझाता है, जहां तक ​​मुझे 'ए ए 3 = चाल (बी) समझा जाता है;' संकलित नहीं होना चाहिए क्योंकि 'a3' एक लवली है। – nwp

+0

उस स्थिति में कोड स्निपेट बिल्कुल मदद नहीं करता है, ठीक – IceFire

+0

धन्यवाद। इसका इस्तेमाल करेंगे। यह काफी करीब है। – PSkocik

3
struct temporary_only { 
    static temporary_only make() { return {}; } 
    temporary_only(temporary_only&&)=delete; 
    int get()&& { return 3; } 
private: 
    temporary_only() {} 
}; 

int main() { 
    //temporary_only x; // illegal 
    std::cout << temporary_only::make().get() << '\n'; // legal 
} 

live example

हम (कॉपी/स्थानांतरित सहित) सभी सार्वजनिक ctors अक्षम करें, इसलिए कोई भी एक temporary_only के माध्यम से temporary_only::make (एक rvalue) को छोड़कर बना सकते हैं।

ध्यान दें कि

temporary_only&& a = temporary_only::make(); 

अभी भी काम करता है। यहां हमारे पास एक रावल्यू संदर्भ के लिए एक रैल्यू है, और यह कि रावल्यू संदर्भ स्वयं एक बहु-रेखा जीवनकाल (गुंजाइश जीवनकाल) के साथ एक अंतराल है। इसे रोका नहीं जा सकता है।

+0

इसके अलावा 'अस्थायी_ऑनली और ए = अस्थायी_ऑनली :: मेक(); ' – NathanOliver

+0

काम करता है और मामलों को और खराब बनाने के लिए' std :: move (a) .get() 'भी ठीक काम करता है। – nwp

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