सभी,std :: unique_ptr नष्ट कर दिया समारोह, initializer_list - संचालित आवंटन
जब मैं एक विजेट सरणी का दृष्टांत एक प्रारंभकर्ता-सूची प्रारूप, एक नग्न सूचक है कि एक सदस्य-चर विजेट उदाहरण के लिए अंक का उपयोग कर संकलित लेकिन करने के लिए परिवर्तन के बाद std :: unique_ptr <> gcc हटाए गए फ़ंक्शन के संबंध में एक संकलन त्रुटि देता है।
$ uname -एक
लिनक्स .. 3.5.0-21-जेनेरिक # 32-उबंटू SMP मंगल दिसंबर 11 18:51:59 यूटीसी 2012 x86_64 x86_64 x86_64 जीएनयू/लिनक्स
$ जी ++ - -संस्करण
जी ++ (Ubuntu/Linaro 4.7.2-5ubuntu1) 4.7.2
इस कोड को निम्नलिखित संकलक त्रुटि देता है:
#include <stdlib.h>
#include <memory>
class Widget
{
public:
Widget() {}
};
class W1 : public Widget
{
public:
W1() {}
};
class W2 : public Widget
{
public:
W2() {}
};
class WFactory
{
public:
WFactory(const int i) : _w(new W1()) {}
WFactory(const char* s) : _w(new W2()) {}
~WFactory() { _w.reset(nullptr); }
// ~WFactory() { delete _w; } <--- for naked ptr
private:
// NOTE: does not compile
std::unique_ptr<Widget> _w;
// NOTE: does compile
// Widget* _w;
};
int main()
{
std::unique_ptr<Widget> a(new W1()); // <--- compiles fine
WFactory wf[] { 4, "msg" }; // <--- compiler error using unique_ptr<>
}
त्रुटि:
$ g++ -o unique_ptr -std=c++11 -Wall unique_ptr.cpp
unique_ptr.cpp: In function ‘int main()’:
unique_ptr.cpp:36:30: error: use of deleted function ‘WFactory::WFactory(const WFactory&)’
unique_ptr.cpp:22:7: note: ‘WFactory::WFactory(const WFactory&)’ is implicitly deleted because the default definition would be ill-formed:
unique_ptr.cpp:22:7: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Widget; _Dp = std::default_delete<Widget>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<Widget>]’
In file included from /usr/include/c++/4.7/memory:86:0,
from unique_ptr.cpp:2:
/usr/include/c++/4.7/bits/unique_ptr.h:262:7: error: declared here
unique_ptr.cpp:36:30: error: use of deleted function ‘WFactory::WFactory(const WFactory&)’
unique_ptr.cpp:36:14: warning: unused variable ‘wf’ [-Wunused-variable]
मैं या तो के रूप में एक नुकसान में हूँ: पर्दे के किसी हटाई fcxn पैदावार के पीछे यांत्रिकी; या अधिक सरलता से, std :: unique_ptr < की अभिव्यक्ति क्यों w/नग्न पीआरटी की तुलना में प्रतिबंधित है।
मेरा प्रश्न है:
- पायलट की गलती?
- संकलक त्रुटि?
- क्या मैं अपना इच्छित कोड w/कुछ परिवर्तन करने के लिए प्राप्त कर सकता हूं?
धन्यवाद।
संपादित करें 1
अपने जवाब है, जो मैं सराहना करते हैं, मैं WFactory के लिए निम्न परिवर्तन कर सकते हैं के आधार पर:
class WFactory
{
public:
WFactory(const WFactory& wf)
{
(const_cast<WFactory&>(wf)).moveto(_w);
}
WFactory(const int i) : _w(new W1()) {}
WFactory(const char* s) : _w(new W2()) {}
~WFactory() { _w.reset(nullptr); }
void moveto(std::unique_ptr<Widget>& w)
{
w = std::move(_w);
}
private:
std::unique_ptr<Widget> _w;
};
(के रूप में अनैतिक कोड चिह्नित किये) और अब कार्यक्रम संकलित और चलाता है। मैं सराहना करता हूं कि मानकों के लोगों ने एक कारण के लिए विनिर्देश लिखा है, इसलिए मैंने अपने मामले को मेरे मामले के लिए एक अच्छा विश्वास विशेषज्ञता के रूप में पोस्ट किया है, जहां मैं वास्तव में पीआरटी की विशिष्टता पर जोर देना चाहता हूं।
संपादित 2
जोनाथन के उत्तरों के आधार पर, निम्न कोड निहित चाल ctor को दबाने नहीं करता है:
class WFactory
{
public:
WFactory(const int i) : _w(new W1()) {}
WFactory(const char* s) : _w(new W2()) {}
private:
std::unique_ptr<Widget> _w;
};
नोट है कि वहाँ सभी में कोई ~WFactory() {..}
।
शायद ya-ans है, लेकिन मुझे पता चला है कि wf [] में मुख्य() में C++ 11-style पुनरावृत्ति का उपयोग करके कोई प्रतिलिपि-ctor-for-WFactory त्रुटि वापस आती है।यह है:
int Main()
..
WFactory wf[] { 4, "msg" };
for (WFactory iwf : wf) <---- compiler error again
// ..
for (unsigned i = 0; i < 2; ++i) <--- gcc happy
wf[i] // ..
}
मुझे लगता है कि यह स्पष्ट है कि नया सी ++ 11-शैली पुनरावृत्ति ऑब्जेक्ट प्रतिलिपि कर रहा है।
ब्रेस्ड सूचियों के माध्यम से प्रारंभिक वस्तुओं को औपचारिक रूप से प्रतिलिपि बनाने की आवश्यकता है, दुर्भाग्यवश। –
धन्यवाद, यह दिलचस्प है। प्रतिलिपि कहां है? त्रुटि इंगित करती है कि WFactory कॉपी करने योग्य होना चाहिए। मुझे वह नहीं मिला। – JayInNyc
यह भाषा के विनिर्देशन में है। प्रतिलिपि वास्तव में अभ्यास में नहीं होगी, लेकिन कक्षा में अभी भी एक सुलभ प्रतिलिपि बनाने की आवश्यकता है। –