में संदर्भ सदस्य के लिए अस्थायी बाध्यकारी के बारे में नकली चेतावनी मैं समझता हूं कि अगर अस्थायी निर्माता की प्रारंभिक सूची में संदर्भ सदस्य से बंधे हैं, तो ऑब्जेक्ट को कन्स्ट्रक्टर रिटर्न के रूप में नष्ट कर दिया जाएगा।कन्स्ट्रक्टर
हालांकि, निम्नलिखित कोड पर विचार करें:
#include <functional>
#include <iostream>
using callback_func = std::function<int(void)>;
int
func(const callback_func& callback)
{
struct wrapper
{
const callback_func& w_cb;
wrapper(const callback_func& cb) : w_cb {cb} { }
int call() { return this->w_cb() + this->w_cb(); }
};
wrapper wrp {callback};
return wrp.call();
}
int
main()
{
std::cout << func([](){ return 21; }) << std::endl;
return 0;
}
यह मेरे लिए पूरी तरह से वैध लग रहा है। callback
ऑब्जेक्ट func
फ़ंक्शन के पूरे निष्पादन के दौरान लाइव रहेगा और wrapper
के निर्माता के लिए कोई अस्थायी प्रतिलिपि नहीं बनाई जानी चाहिए।
वास्तव में, जीसीसी 4.9.0 सभी चेतावनियों के साथ ठीक से संकलित करता है।
$ g++ -std=c++11 -W main.cpp
main.cpp: In constructor ‘func(const callback_func&)::wrapper::wrapper(const callback_func&)’:
main.cpp:12:48: warning: a temporary bound to ‘func(const callback_func&)::wrapper::w_cb’ only persists until the constructor exits [-Wextra]
wrapper(const callback_func& cb) : w_cb {cb} { }
^
यह एक झूठी सकारात्मक है या मैं वस्तु जीवन काल गलतफहमी हूँ:
हालांकि, जीसीसी 4.8.2 संकलक मुझे निम्न चेतावनी देता है?
यहाँ मेरी सटीक संकलक संस्करणों का परीक्षण कर रहे हैं:
$ g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ --version
g++ (GCC) 4.9.0 20140604 (prerelease)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ऑप्टिमाइज़ेशन को बंद करना मुझे एक सीजी गलती देता है। वेलग्रिंड बताते हैं कि समस्या कहीं आसपास 'समारोह (std :: समारोह स्थिरांक और) :: आवरण :: कॉल()' है। –
'w_cb {cb}' का उपयोग करके मेरे लिए सेगमेंटेशन उल्लंघन में परिणाम। 'W_cb (cb)' का उपयोग करना एक ही समस्या से पीड़ित नहीं है। जी ++ 4.8.3 में परीक्षण किया गया। –
मैं जीसीसी 4.8.2 के साथ वेलग्रिंड त्रुटि पुन: पेश कर सकते हैं। (नहीं एक segfault, कठिन, कार्यक्रम 42 आउटपुट और उम्मीद के रूप में सफलतापूर्वक बाहर निकालता है।) निष्पादन जीसीसी 4.9.0 द्वारा उत्पादित वेलग्रिंड-साफ है। ये अवलोकन विभिन्न अनुकूलन स्तरों के साथ नहीं बदलते हैं। – 5gon12eder