निम्न कोड को संकलित करता बजना 3.0 के साथ/libC++:std :: make_shared, std :: unique_ptr और चाल कंस्ट्रक्टर्स
#include <memory>
class Foo
{
public:
Foo()
: mem_(new int(10))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>();
return 0;
}
लेकिन यह एक (std::string
पैरामीटर जोड़ा) नहीं करता है:
#include <memory>
#include <string>
class Foo
{
public:
Foo(const std::string& s)
: mem_(new int(10))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>("aaa");
return 0;
}
क्लैंग एक हटाए गए कन्स्ट्रक्टर के उपयोग के बारे में शिकायत करता है। मेरे लिए, इसका कोई मतलब नहीं है, क्योंकि std::make_shared
को Foo इंस्टेंस की प्रतिलिपि नहीं माना जाता है, केवल एक चीज जो std::unique_ptr
के (हटाए गए) प्रतिलिपि निर्माता को कॉल ट्रिगर करेगी।
लेकिन देखो और जैसे ही मैं एक चालक कन्स्ट्रक्टर को स्पष्ट रूप से परिभाषित करता हूं, यह संकलित करता है।
#include <memory>
#include <string>
class Foo
{
public:
Foo(const std::string& s)
: mem_(new int(10))
{
}
Foo(Foo&& other)
: mem_(std::move(other.mem_))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>("aaa");
return 0;
}
अब, सवाल:
- क्यों यह पहले उदाहरण में संकलित करता है, लेकिन दूसरी नहीं?
std::make_shared
इसे बनाते समय वस्तु को प्रतिलिपि/स्थानांतरित कर सकते हैं?- एक चालक कन्स्ट्रक्टर जोड़ने से समस्या ठीक क्यों होती है? मुझे याद नहीं है कि गैर-डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ने से एक अंतर्निहित चाल कन्स्ट्रक्टर को दबाया जाना चाहिए।
संपादित करें: की जांच की गई और सभी उदाहरण जीसीसी 4.5.1 (ideone.com के माध्यम से), मुझे लगता है कि यह एक बजना/libC++ बग की बात है के साथ ठीक संकलित करने के लिए दिखाई देते हैं, लेकिन सवाल 2 और 3 अभी भी खड़े हो जाओ, प्लस मैं जानना चाहता हूं कि कौन सा कंपाइलर अधिक "सही" है।
मुझे नहीं लगता कि कभी एक अंतर्निहित कदम प्रदान की निर्माता है –
@parapura राजकुमार (1) unique_ptr को हटाने इसे दूर (यहां तक कि गैर-डिफ़ॉल्ट करते जाते हैं सीटीओआर), (2) निहित चाल कन्स्ट्रक्टर अभी भी नवीनतम शब्द के अनुसार परिभाषित किया गया है: http: //mmocny.wordpress।कॉम/2010/12/09/implicit-move-wont-go/ –
@parapurarajkumar: वास्तव में, मुझे उन चर्चाओं को पढ़ने की याद आती है जहां निहित चालक रचनाकार एक बुरी चीज थीं, और मानक से हटा दी जानी चाहिए। हालांकि, मैं कहानी के अंत को नहीं जानता। –