मेरा प्रश्न स्थैतिक सदस्य प्रारंभकर्ताओं के लिए लैम्ब्डा स्कोप के बारे में है।स्थिर सदस्यों के प्रारंभकर्ता के लिए लैम्ब्डा स्कोप
#include <functional>
#include <iostream>
struct S {
static const std::function<void(void)> s_func;
};
const std::function<void(void)> S::s_func = []() {
std::cout << "Hello from " << __PRETTY_FUNCTION__ << std::endl;
};
int main(void) {
S::s_func();
return 0;
}
4,8 से शुरू जीसीसी एस के दायरे में लैम्ब्डा परिभाषित करता है, तो कार्यक्रम कुछ इस तरह आउटपुट:
Hello from S::<lambda()>
(जीसीसी-4.8.2 एक अलग परिभाषा है निम्न परीक्षण पर विचार करें __FUNCTION__
& सह मैक्रो के लिए, लेकिन फिर भी लैम्ब्डा अभी भी S
भीतर परिभाषित किया गया है)
इस बीच जीसीसी-4.7 वैश्विक क्षेत्र में लैम्ब्डा परिभाषित करता है, तो प्रोग्राम outputs
Hello from <lambda()>
शायद नए जीसीसी अधिक मानक-अनुरूप हैं। हालांकि मैं यह पूछना चाहता हूं कि मानक वास्तव में इस पहलू को निर्दिष्ट करता है या यह कार्यान्वयन-निर्भर हो सकता है।
अद्यतन: @ user5434961 के रूप में सुझाव दिया है कि सभी __FUNCTION__
-alike मैक्रो कार्यान्वयन निर्भर कर रहे हैं, तो यह उन्हें एक मानक अनुरूप परीक्षण में से बचने के लिए बेहतर है।
#include <functional>
#include <iostream>
struct S {
static const std::function<void(void)> s_func;
private:
static const int s_field;
};
const std::function<void(void)> S::s_func = []() {
std::cout << "Hello from S::s_func. S::s_field = " << S::s_field << std::endl;
};
const int S::s_field = 1;
int main(void) {
S::s_func();
return 0;
}
मुझे लगता है कि आपको अद्यतन उदाहरण में 'S :: s_field' को 's_field' में बदलना चाहिए? अन्यथा, मुझे लगता है कि यह हमेशा जो कुछ भी गुंजाइश है उसे संकलित करता है। – Lingxi
ठीक है, चूंकि 'एस :: एस_फील्ड 'निजी है, इसलिए इसे वैश्विक दायरे से नहीं पहुंचा जा सकता है, इसलिए कोड जीसीसी -4.7 पर संकलन को तोड़ देता है वास्तव में – user3159253
हां, हां। मैंने निजी चीज़ को नजरअंदाज कर दिया। – Lingxi