मान लीजिए आप एक वर्ग उत्पाद कहा जाता है, इस तरह परिभाषित किया गया है:ऑटो + ब्रेस शैली प्रारंभिकता को अनुकूलित करने के लिए संकलक को कब अनुमति दी जाती है?
class Product
{
public:
Product(const char *name, int i);
Product(Product &&rhs);
Product(const Product &rhs);
~Product();
private:
const char *m_name;
int m_i;
};
और आप इस तरह एक चर प्रारंभ:
auto p = Product{"abc",123};
मैंने सोचा था कि मानक तय करती है कि एक संकलक तार्किक निम्न कार्य करना होगा :
- निर्माण एक अस्थायी उत्पाद
- चाल-निर्माण पी (का उपयोग करते हुए अस्थायी उत्पाद)
लेकिन यह कि संकलक को इसे अनुकूलित करने की अनुमति थी ताकि पी सीधे बनाया जा सके।
मैंने यह सत्यापित किया (विजुअल स्टूडियो 2013) और वास्तव में, संकलक इसे अनुकूलित करता है, भले ही हमारे पास अपना स्वयं का कस्टम (गैर-डिफ़ॉल्ट) चालक-निर्माता है। यह ठीक है।
हालांकि, अगर मैं स्पष्ट रूप से copy--निर्माता ले जाते हैं, इस तरह हटा सकते हैं और:
class Product
{
public:
Product(const char *name, int i);
Product(Product &&rhs) = delete;
Product(const Product &rhs) = delete;
~Product();
private:
const char *m_name;
int m_i;
};
ऑटो + ब्रेस आरंभीकरण अभी भी संकलित करता है। हालांकि यद्यपि संकलक को इसे रोकना पड़ा क्योंकि कोई प्रतिलिपि नहीं है- या चाल-अनुमति है।
अजीब पर्याप्त, मैं नष्ट कर दिया copy- बनाने के लिए और ले जाने-निर्माता निजी, इस तरह अगर:
class Product
{
public:
Product(const char *name, int i);
~Product();
private:
Product(Product &&rhs) = delete;
Product(const Product &rhs) = delete;
const char *m_name;
int m_i;
};
फिर स्वचालित + ब्रेस आरंभीकरण अब और संकलक नहीं है।
error C2248: 'Product::Product' : cannot access private member declared in class 'Product'
क्या यह अपेक्षित व्यवहार है? क्या यह विजुअल स्टूडियो 2013 (अद्यतन 3) में एक बग है?
नोट: मैंने इसे ideone पर संकलित करने का प्रयास किया और वहां वास्तव में प्रारंभिक संकलन करने से इंकार कर दिया जब प्रतिलिपि और चालक-रचनाकार हटा दिए जाते हैं (और सार्वजनिक)। तो मुझे लगता है कि यह एक विजुअल स्टूडियो बग है।
बस FYI विजुअल स्टूडियो 2013 में, * संकलक उत्पन्न * इस कदम निर्माणकर्ता और ले जाने के काम ऑपरेटरों ** समर्थित नहीं हैं ** (आप अपने खुद के परिभाषित कर सकते हैं, हालांकि)। [यहां वीएस2013 के सी ++ 11 (गैर) अनुपालन की एक सूची है [https://msdn.microsoft.com/en-us/library/hh567368.aspx#featurelist) – CoryKramer
कंपाइलर संस्करण 18.00.30723। क्या यह बग 21005 और 30723 के बीच पेश किया जा सकता है? – Patrick
@ पैट्रिक एनवीएम। एक बार जब मैंने कन्स्ट्रक्टर के लिए रिक्त ब्रैकेट प्रदान किए और इसे वितरित करने वाले विनाशक को वीएस पर संकलित किया गया। – NathanOliver