2013-03-13 3 views
6

सी ++ 11 वाक्यविन्यास के बारे में सरल सवाल। वहाँ एक नमूना कोड (source से एक कम)ब्रेसिज़ के साथ कॉलिंग सीटीआर

struct Wanderer 
{ 
    explicit Wanderer(std::vector<std::function<void (float)>> & update_loop) 
    { 
    update_loop.emplace_back([this](float dt) { update(dt); }); 
    } 
    void update(float dt); 
}; 

int main() 
{ 
    std::vector<std::function<void (float)>> update_loop; 
    Wanderer wanderer{update_loop}; // why {} ??? 
} 

मुझे पता करना चाहते हैं, यह कैसे Wanderer wanderer{update_loop}; तरह कर्ली कोष्ठक के साथ संभव कॉल निर्माता यह न तो प्रारंभकर्ता सूची है, और न ही वर्दी प्रारंभ हो सकता है। यह क्या बात है?

+0

लेकिन यह समान प्रारंभिक है। ब्रेस का इस्तेमाल कन्स्ट्रक्टर को कॉल करने के लिए किया जा सकता है, हालांकि उस प्रकार के 'std :: startizer_list' लेने वाले कन्स्ट्रक्टर को हमेशा पसंद किया जाता है। – chris

+0

'// क्यों {} ???' - अच्छा सवाल। 'वंडरर वंडरर (update_loop)' पर इसे प्राथमिकता देने का कोई कारण नहीं है। – ipc

+1

@ipc कुछ मामलों में, यह सबसे परेशान पार्स से बच सकता है। – juanchopanza

उत्तर

13

यह न तो प्रारंभकर्ता सूची है, न ही वर्दी प्रारंभिकता है। यह क्या बात है?

आपका आधार गलत है। यह समान प्रारंभिक है और, मानक शब्दों में, प्रत्यक्ष-ब्रेस-प्रारंभिकरण

जब तक std::initializer_list स्वीकार करने वाले निर्माता को मौजूद नहीं है, तो ऑब्जेक्ट्स बनाने के लिए ब्रेसिज़ का उपयोग करके ब्रांड्स का उपयोग करने के बराबर होता है।

ब्रेसिज़ का उपयोग करने का लाभ यह है कि वाक्य रचना Most Vexing Parse समस्या के लिए प्रतिरक्षा है:

struct Y { }; 

struct X 
{ 
    X(Y) { } 
}; 

// ... 

X x1(Y()); // MVP: Declares a function called x1 which returns 
      // a value of type X and accepts a function that 
      // takes no argument and returns a value of type Y. 

X x2{Y()}; // OK, constructs an object of type X called x2 and 
      // provides a default-constructed temporary object 
      // of type Y in input to X's constructor. 
1

यह सिर्फ सी ++ 11 वाक्य रचना है। आप घुमावदार ब्रेसिज़ के साथ अपने कन्स्ट्रक्टर को कॉल करने वाली ऑब्जेक्ट्स प्रारंभ कर सकते हैं। आपको बस यह ध्यान में रखना होगा कि यदि प्रकार में प्रारंभकर्ता_सूची कन्स्ट्रक्टर है, तो उसे प्राथमिकता मिलती है।

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