मेरे पास एक टेम्पलेट में कुछ कष्टप्रद कोड है जो @R. Martinho Fernandes की चाल का उपयोग करता है जो लूप को एक भिन्न टेम्पलेट में कुछ पैक पैरामीटर अनलोल करता है और तर्क सूची में प्रत्येक तर्क पर एक ही कोड का आह्वान करता है।सी ++ लैम्ब्डा टेम्प्लेट में दूसरे विस्तार पर वैरिएबल कैप्चर नहीं कर रहा है?
हालांकि, यह लगता है जैसे कि लैम्ब्डा को ठीक से प्रारंभ नहीं किया जा रहा है और वे इसके बजाय फ़ैक्टर (?) उदाहरणों में चर साझा कर रहे हैं, जो गलत लगता है।
इस कोड को देखते हुए:
#include <iostream>
#include <functional>
template<typename... Args>
void foo(Args ... args) {
int * bar = new int();
*bar = 42;
using expand_type = int[];
expand_type{(
args([bar]() {
std::cerr<<std::hex;
std::cerr<<"&bar="<<(void*)&bar<<std::endl;
std::cerr<<" bar="<<(void*)bar<<std::endl;
std::cerr<<" bar="<<*bar<<std::endl<<std::endl;
}),
0) ...
};
};
int main() {
std::function<void(std::function<void()>)> clbk_func_invoker = [](std::function<void()> f) { f(); };
foo(clbk_func_invoker, clbk_func_invoker);
return 0;
}
मैं निम्नलिखित उत्पादन प्राप्त करें:
&bar=0x7ffd22a2b5b0
bar=0x971c20
bar=2a
&bar=0x7ffd22a2b5b0
bar=0
Segmentation fault (core dumped)
तो, मेरा मानना है कि मैं देख रहा हूँ कि दो functor उदाहरणों पर कब्जा कर लिया चर के लिए एक ही पते का हिस्सा है bar
, और पहले मज़ेदार के आवेषण के बाद, bar
को nullptr
पर सेट किया जा रहा है, और फिर दूसरा मज़ेदार seg'-faults जब को 01 को अव्यवस्थित करने की कोशिश करता हैपरिवर्तनीय (ठीक उसी पते में)।
एफवाईआई, मुझे एहसास है कि मैं [bar](){...
फ़ैक्टर को एक चर std::function
चर में ले जाकर और फिर उस चर को कैप्चर करके इस समस्या के आसपास काम कर सकता हूं। हालांकि, मैं क्यों समझना चाहूंगा दूसरा मज़ेदार उदाहरण सटीक उसी bar
पते का उपयोग कर रहा है और इसे nullptr
मान क्यों प्राप्त हो रहा है।
मैंने जीएनयू के जी ++ के साथ अपने ट्रंक संस्करण को पुनर्प्राप्त और कल संकलित किया।
व्यक्तिगत रूप से, मुझे लगता है कि यह वास्तव में जीसीसी में एक कंपाइलर बग है, लेकिन मैं इसे दर्ज करने से पहले बिल्कुल निश्चित होना चाहता हूं। मुझे पता है कि आपको लगभग कंपाइलर को कभी दोष नहीं देना चाहिए, लेकिन शायद इस बार ... इसके अलावा, मेरे असली मामले के लिए मेरे पास एक काम है। मैं आश्चर्यचकित नहीं होगा अगर यह संकलक के लिए अपेक्षाकृत अद्वितीय परीक्षण मामला था।कोड बल्कि preosterous है। –
@Yakk आपने मूल मुद्दे का उत्तर नहीं दिया, * .. वे बदले में फ़ैक्टर (?) उदाहरणों में चर साझा कर रहे हैं .. * क्यों पैक का विस्तार करना केवल एक प्रति साझा करने के बजाय प्रत्येक विस्तार के लिए बार की एक प्रति नहीं बनाते सभी विस्तारित बंद होने के लिए बार का, इस तरह का विस्तार इतना खास क्यों बनाता है? – xhamr
@xhamr क्योंकि पैरामीटर पैक विस्तार के अंदर लैम्बडास के लिए समर्थन flakey है? मैंने इसे छोड़ दिया क्योंकि अधिकांश कंपाइलर कानूनी कोड संकलित करने में विफल रहे। – Yakk