पर विचार करें:क्या मुझे std :: एक move_ptr को एक चालक कन्स्ट्रक्टर में ले जाना चाहिए?
#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below
private:
shared_ptr<string> foo_;
};
/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/
// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}
int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});
random_shuffle(gizmos.begin(), gizmos.end());
}
उपरोक्त कोड में, वहाँ Gizmo::Gizmo(Gizmo&&)
के दो संस्करण हैं - एक std::move
का उपयोग करता है वास्तव में कदमshared_ptr
, और अन्य बस प्रतियां shared_ptr
करने के लिए।
दोनों संस्करण सतह पर काम करने लगते हैं। एक अंतर (केवल अंतर जो मैं देख सकता हूं) गैर-move
संस्करण में है shared_ptr
की संदर्भ संख्या अस्थायी रूप से बढ़ी है, लेकिन केवल संक्षेप में।
मैं सामान्य रूप से आगे बढ़ता हूं और move
shared_ptr
, लेकिन केवल मेरे कोड में स्पष्ट और सुसंगत होने के लिए। क्या मैं यहां पर विचार कर रहा हूं? क्या मुझे किसी अन्य तकनीकी कारण के लिए दूसरे पर एक संस्करण पसंद करना चाहिए?
एक चालक कन्स्ट्रक्टर में स्थानांतरित करना कम से कम अर्थात् संगत है ... – ildjarn
आप स्ट्रिंग को shared_ptr में क्यों रखते हैं? एक सदस्य-चर के रूप में एक साझा_ptr अक्सर खराब डिजाइन का संकेत है। –
एक चालक कन्स्ट्रक्टर में स्थानांतरित करना संकलक स्वचालित रूप से जेनरेट करेगा। –