किसी संदर्भ सदस्य के साथ एक कक्षा में कोई डिफ़ॉल्ट-प्रदान की गई प्रतिलिपि/चाल असाइनमेंट ऑपरेटर नहीं हैं। बाध्यकारी स्थापित होने के बाद संदर्भ एक अलग चर के संदर्भ में रिबाउंड नहीं किया जा सकता है। संक्षेप में, कॉपी कन्स्ट्रक्टर उस प्रारंभिक स्थापना कर रहा है, जबकि डिफ़ॉल्ट असाइनमेंट ऑपरेटर को बाध्यकारी के बाद बदलने की कोशिश करेगा।
मानक इसलिए इस मामले को डिफ़ॉल्ट प्रतिलिपि दोनों के लिए कॉल करता है और असाइनमेंट ऑपरेटरों को ले जाता है।
सी ++ 11 § 12.8p23
दसवीं कक्षा के लिए एक डिफॉल्ट की कॉपी/कदम असाइनमेंट ऑपरेटर के रूप में नष्ट करता है, तो एक्स है परिभाषित किया गया है:
- एक साथ एक संस्करण सदस्य गैर तुच्छ असाइनमेंट ऑपरेटर इसी और एक्स एक संघ की तरह वर्ग, या
- एक स्थिरांक गैर वर्ग प्रकार (या उसके सरणी) की गैर स्थैतिक डेटा सदस्य, या
012,351 है
- संदर्भ प्रकार की एक गैर स्थिर डेटा सदस्य, या
- वर्ग प्रकार एम (या उसके सरणी) के एक गैर स्थैतिक डेटा सदस्य जो कॉपी नहीं किया जा सकता है/क्योंकि अधिभार संकल्प (13 ले जाया गया।3), के रूप में एम के लिए इसी असाइनमेंट ऑपरेटर के लिए आवेदन किया, एक अस्पष्टता या एक समारोह डिफॉल्ट की असाइनमेंट ऑपरेटर से हटा दिया या दुर्गम है कि में परिणाम है, या
- साथ सीधा या आभासी आधार वर्ग बी की प्रतिलिपि नहीं बनाई जा सकती है/क्योंकि अधिभार संकल्प ले जाया गया (13.3), बी के लिए इसी असाइनमेंट ऑपरेटर के लिए आवेदन किया के रूप में, एक अस्पष्टता या एक समारोह डिफॉल्ट की असाइनमेंट ऑपरेटर से हटा दिया या दुर्गम है कि, या
कदम असाइनमेंट ऑपरेटर के लिए
- , के साथ एक गैर स्थैतिक डेटा के किसी सदस्य या प्रत्यक्ष आधार वर्ग में परिणाम एक प्रकार जिसमें एक चाल असाइनमेंट ऑपरेटर नहीं है और यह तुलनीय रूप से कॉपी करने योग्य नहीं है, या कोई प्रत्यक्ष या अप्रत्यक्ष वर्चुअल बेस क्लास नहीं है।
आप निश्चित रूप से लिख सकते हैं अधिभार।
#include <iostream>
struct A
{
A(int& var) : r(var) {}
int &r;
A& operator=(const A& obj)
{
r = obj.r; // value copied, reference-binding remains the same
return *this;
}
};
int main(int argc, char** argv)
{
int x = 42;
int y = 43;
A a1(x);
A a2(y);
A a3 = a1; // legal. default copy-ctor invoked
a3 = a2; // legal. user-defined copy-assignment invoked
std::cout << x << ',' << y << '\n';
return 0;
}
आउटपुट
43,43
लेकिन यह नहीं होगा (और नहीं कर सकते हैं) संदर्भ rebind। यहां प्रदान किया गया अधिभार संदर्भित डेटा बदलता है; खुद संदर्भ नहीं। ऐसा भेद महत्वपूर्ण है।
उम्मीद है कि इससे मदद मिलती है।
[क्या आप पूरी प्रश्नोत्तरी पोस्ट करने जा रहे हैं?] (Http://stackoverflow.com/questions/27792560/c-why-constructor-aa-a-is-illegal) – WhozCraig
आह .. यह समझ में आता है। 97.4% परीक्षण बीटीडब्ल्यू पर grats। – WhozCraig
अवैध * * असाइन करने के लिए *, कॉपी * नहीं *। – Potatoswatter