यह न्यूनतम कार्यक्रमlambdas, स्थानीय प्रकार, और वैश्विक नामस्थान
template <typename X>
void foo (X x)
{
bar (x);
}
template <typename X>
void bar (X x)
{
}
int main()
{
foo ([]{});
}
जीसीसी (4.8.5 और 5.3) के साथ संकलित करता है तथा बजना के साथ संकलित करने के लिए विफल रहता है (3,7)
मेरे विश्लेषण इस प्रकार है के रूप में।
bar
foo
में प्रयोग किया जाता है और foo
के बाद घोषित कर दिया, तो यह foo
परिभाषा बिंदु पर दिखाई नहीं देता है। bar
पर एकमात्र तरीका foo
तत्काल बिंदु तर्क-निर्भर लुकअप के माध्यम से पाया जा सकता है।
foo
और bar
दोनों का एकमात्र तर्क main
में परिभाषित लैम्ब्डा है।
स्पष्ट रूप से जीसीसी वैश्विक नामस्थान में घोषित के रूप में अपने प्रकार का सम्मान करता है, जबकि क्लैंग नहीं करता है। इस प्रकार, जीसीसी एडीएल के माध्यम से bar
पा सकता है और क्लैंग नहीं कर सकता है।
int main()
{
struct K{};
foo (K()); // gcc compiles, clang complains
}
ऐसा लगता है कि जीसीसी यहाँ गलत में है: जब हम एक प्रकार main
में स्थानीय रूप से परिभाषित का उपयोग
यही बात होता है। मानक के अनुसार लैम्ब्डा का प्रकार अज्ञात (expr.prim.lambda/3) है, इसलिए यह किसी भी नामस्थान से संबंधित नहीं होना चाहिए। माना जाता है कि स्थानीय प्रकार या तो वैश्विक नामस्थान से संबंधित नहीं होना चाहिए।
क्या विश्लेषण सही है? क्या यह ज्ञात जीसीसी बग है?
यह प्रश्न this question से प्रेरित है।
तो, लघु संस्करण "क्या स्थानीय लैम्ब्डा का नाम किसी नामस्थान से संबंधित है, और यदि ऐसा है तो कौन सा?" और एक द्वितीयक अंतर्निहित "फ़ाइल/नेमस्पेस/वर्ग स्कोप पर लैम्ब्डा का प्रकार किसी नामस्थान से संबंधित है, और यदि ऐसा है तो कौन सा?" – Yakk