इस
को यह बराबर है हां। लेकिन यह केवल उन वर्गों के लिए मान्य है जिनके पास गैर-चलने योग्य सदस्य नहीं हैं।इस उदाहरण को देखो:
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable &) = default;
nonmovable( nonmovable &&) = delete;
};
struct movable
{
movable() = default;
movable(const movable &) { std::cerr << "copy" << std::endl; }
movable( movable &&) { std::cerr << "move" << std::endl; }
};
struct has_nonmovable
{
movable a;
nonmovable b;
has_nonmovable() = default;
has_nonmovable(const has_nonmovable &) = default;
has_nonmovable( has_nonmovable &&) = default;
};
int main()
{
has_nonmovable c;
has_nonmovable d(std::move(c)); // prints copy
}
यह प्रिंट:
copy
http://coliru.stacked-crooked.com/a/62c0a0aaec15b0eb
तो अगर एक वर्ग एक भी गैर जंगम सदस्य है, स्पष्ट रूप से चूक चाल निर्माता प्रतिलिपि कंस्ट्रक्टर्स का उपयोग करेगा सभी सदस्यों के लिए, यहां तक कि जिनके पास चालक कन्स्ट्रक्टर है।
लेकिन सदस्यों को स्पष्ट रूप से परिभाषित या स्पष्ट रूप से डिफॉल्ट कन्स्ट्रक्टरों को डिफॉल्ट करने की आवश्यकता नहीं है। यदि चालक कन्स्ट्रक्टर को बिल्कुल घोषित नहीं किया जाता है, तो चालक का उपयोग उन सदस्यों के लिए किया जाएगा जिनके पास चालक कन्स्ट्रक्टर है और कॉपी कन्स्ट्रक्टर का उपयोग उन सदस्यों के लिए किया जाएगा जो चालक कन्स्ट्रक्टर को परिभाषित नहीं करते हैं। उदाहरण देखें:
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable &) { std::cerr << "nonmovable::copy" << std::endl; }
//nonmovable( nonmovable &&) = delete;
};
struct movable
{
movable() = default;
movable(const movable &) { std::cerr << "movable::copy" << std::endl; }
movable( movable &&) { std::cerr << "movable::move" << std::endl; }
};
struct has_nonmovable
{
movable a;
nonmovable b;
has_nonmovable() = default;
has_nonmovable(const has_nonmovable &) = default;
has_nonmovable( has_nonmovable &&) = default;
};
int main()
{
has_nonmovable c;
has_nonmovable d(std::move(c));
}
यह प्रिंट:
movable::move
nonmovable::copy
http://coliru.stacked-crooked.com/a/fda51f29a4b92881
क्लासेस चल लेकिन गैर copyable (जैसे unique_ptr
) कर रहे हैं कर रहे हैं। ऐसे वर्ग हैं जो प्रतिलिपि बनाने योग्य हैं और प्रतिलिपि बनाने के लिए कॉपी कन्स्ट्रक्टर का उपयोग करते हैं। लेकिन मुझे एक वर्ग बनाने की कोई वजह नहीं है जो कॉपी करने योग्य है लेकिन स्पष्ट रूप से हटाए गए कन्स्ट्रक्टर को हटा दिया गया है।
स्रोत
2018-02-26 11:38:17
यह http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor –
@ डाइटर लुकिंग का एक डुप्लिकेशंस हो सकता है: यह स्पष्ट रूप से नहीं है, हालांकि यह एक समान विषय पर है और कुछ उत्तर समान जमीन को कवर कर सकते हैं। हालांकि, हम एक दूसरे के डुप्लिकेट के रूप में चाल semantics के बारे में हर एक सवाल बंद नहीं करेंगे। –
नोट, मैंने इस प्रश्न का मेरा जवाब जोड़ा क्योंकि उस समय मैं मानक से उद्धरण की तलाश कर रहा था जो साबित हुआ कि वे बराबर थे और स्वीकृत उत्तर ऐसा नहीं करता है। तो, मुझे अभी उद्धरण मिला और मेरा जवाब जोड़ा। –