2013-11-20 15 views
7

के साथ एक std :: फ़ंक्शन क्रैश से बांधें std :: function के साथ std :: bind को संयोजित करते समय मुझे कुछ subtleties को समझने में परेशानी हो रही है।std :: क्लैंग

मैं निम्नलिखित कोड का टुकड़ा करने के लिए अपने समस्याओं को कम से कम किया है: स्पष्ट रूपांतरण

#include <functional> 
#include <iostream> 

void bar(int x) { 
    std::cout << "Hello." << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    std::function<void(int)> f1 = std::bind(bar, std::placeholders::_1); 

    // CRASHES with clang, works fine in VS2010 and VS2012 
    std::function<void()> f2 = std::bind(f1, 1); 

    f2(); 

    return 0; 
} 

नोट एसटीडी :: समारोह <> (auto साथ std::function<void()> की जगह जब f2 निर्माण ठीक काम करता है)।

ओएस एक्स पर बजना (XCode 5.0.1, ओएस एक्स 10.9 एसडीके) के साथ f1 वस्तु दुर्घटनाओं को कॉपी करके f2 बनाना, लेकिन VS2010/VS2012 के साथ ठीक काम करता है। एक लम्बे समय तक कॉलस्टैक के बाद, कोड EXC_BAD_ACCESS के साथ क्रैश हो जाता है - ध्यान दें कि फ़ंक्शन ऑब्जेक्ट का निर्माण करते समय, इसे कॉल करते समय नहीं।

क्या यह लाइब्रेरी कार्यान्वयन या मेरे कोड में कोई समस्या है?

का संभावित हल स्पष्ट रूप से इस तरह, operator() सदस्य कॉल करने के लिए है:

std::function<void()> f2 = 
    std::bind(&std::function<void(int)>::operator(), f1, 1); 

लेकिन के रूप में यह VS2012 पर संकलित करने के लिए विफल रहता है यह एक चेतावनी के साथ आता है (लेकिन VS2010 में काम करता है)। ऐसा लगता है कि a bug with VS2012 है।

+0

एक संबंधित प्रश्न http://stackoverflow.com/q/19820128/227322 प्रतीत होता है। – villintehaspam

उत्तर

2

आपका कोड क्लैंग 3.4 (ट्रंक, 1 9 4324) के साथ ठीक काम करता है। यह जीसीसी 4.7.2 के साथ भी काम करता है।

मुझे -Wall -Wextra -pedantic के साथ कोई चेतावनी नहीं मिलती है (उन लोगों को छोड़कर जो अप्रयुक्त x, argc और argv पैरामीटर के बारे में शिकायत करते हैं)।

ऐसा लगता है जैसे क्लैंग कार्यान्वयन अतीत में छोटी गाड़ी थी लेकिन इसे ठीक कर दिया गया है।

+0

आप सही हैं, एक्सकोड 5.0.2 में अपग्रेड करना चाल चल रहा है। – villintehaspam

+0

@ villintehaspam इसे सुनकर खुशी हुई! – Ali

+0

चेतावनी का एक शब्द हालांकि, ऐसा लगता है कि एप स्टोर से डाउनलोड किए गए एक्सकोड 5.0.2 के बीच कुछ प्रकार का अंतर है जो डेवलपर.एप.पी.पी.पी. से डाउनलोड किया गया है। यह देव से डाउनलोड किए गए संस्करण में काम करता है, लेकिन ऐप स्टोर में से एक में नहीं। – villintehaspam

संबंधित मुद्दे