अन्य उत्तरों के अलावा, कभी-कभी घोषणाकर्ता को भी संश्लेषित किया जाना चाहिए।
उदाहरण के लिए:
struct A {};
struct B { A a; };
namespace N {
struct B { int a; };
void f()
{
A (::B::*p) = &::B::a; // this() cannot be omitted
}
}
तो ()
उपरोक्त कोड में छोड़ दिया जाता है, संकलक एक लगातार नेस्टेड नाम विनिर्देशक A::B
A
और ::B
के बजाय पहचानता है, और एक त्रुटि जारी करेगा।
यह संश्लेषण आवश्यक है, लेकिन कभी-कभी एक भ्रामक स्थिति की ओर जाता है।
struct A {
int m;
A() {}
A(int) {} // this isn't called
};
int i;
int main()
{
A(i); // this is a declaration
i.m = 1; // ok
}
उपरोक्त कोड में, A(i)
एक वस्तु i
, के बजाय एक int
तर्क i
के साथ एक निर्माता कॉल अभिव्यक्ति की घोषणा (और यह भी इस मामले में एक परिभाषा) है।
उम्मीद है कि इससे मदद मिलती है।
स्रोत
2011-01-18 21:54:55
हालांकि यह एक पूर्णांक घोषित करने के लिए पूरी तरह से कानूनी वाक्यविन्यास है, क्योंकि आपके साथी डेवलपर्स के लिए इसे 'int m' में बदल दिया गया है। –