असल में, क्या यह काम इस बात पर निर्भर करता है कि आपकी संरचना के सदस्यों के पास क्या है। in
स्टोरेज क्लास const scope
के बराबर है। तो, void addLine(in Line l)
लिखने का अर्थ है कि l
const है। और चूंकि const
संक्रमणीय है, सभी Line l
संरचना सदस्य const
भी हैं।
Shape
सदस्य Line[] lines
हालांकि const
नहीं है। तो, आप const Line l
को const
पर कुछ ऐसा करने की कोशिश कर रहे हैं। चाहे यह संभव है struct Line l
के सभी सदस्यों के प्रकारों पर निर्भर करता है। यदि सभी line
के सदस्यों के पास मूल्य (प्रति) अर्थशास्त्र है, यह संलग्न (जो असाइनमेंट है) संभव है। यदि किसी एक सदस्य के पास (कुछ) संदर्भ अर्थशास्त्र (उदा। एक सूचक की प्रतिलिपि बनाई जाती है), यह संलग्न अब और संभव नहीं है। अन्यथा, आप const Line lc
addLines
में दे सकते हैं, लेकिन lines
के गैर-कॉन्स सदस्य प्राप्त करेंगे। इस माध्यम से, आप भी संदर्भ अर्थ विज्ञान के साथ मूल्य को बदल सकता है, परोक्ष रूप से मूल lc
की, मान परिवर्तित, जिससे const
गारंटी, डी में
उदाहरण const
की अर्थात् संक्रामिता का उल्लंघन:
class C { }
struct Line {
int i;
// int* p; // if you uncomment this, addLine fails
// C c; // if you uncomment this, addLine fails
}
struct Shape {
Line[] lines;
void addLine(in Line l) { lines ~= l; }
}
void main() { }
संपादित करें: बीटीडब्ल्यू, इसे काम करने का एक और तरीका Line[] lines;
से const(Line)[] lines;
को बदलना है। सरणी से केवल const
तत्व होते हैं, और addLine
में const l
को जोड़ना संभव है।
Thx, बहुत अच्छी तरह से समझाया गया! – Trass3r