2017-12-19 130 views
8

मैंने मिश्रित परिणामों के साथ निम्नलिखित C++ 11 कोड संकलित करने का प्रयास किया।शाखा में लैम्ब्डा निरंतर अभिव्यक्ति से नहीं लिया गया: कौन सही है?

struct NoTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

NoTemplate no_inst; 


template<typename> 
struct YesTemplate { 
    static constexpr auto (*foo)() = false ? +[]{} : nullptr; 
}; 

YesTemplate<float> yes_inst; 
  • बजना: सफलतापूर्वक NoTemplate संकलित; YesTemplate पर error: a lambda expression may not appear inside of a constant expression देता है।
  • जीसीसी: दोनों सफलतापूर्वक संकलित
  • msvc: क्रैश।
  • आईसीसी: क्रैश (हम एक विजेता है!)

सही परिणाम क्या है? मुझे कुछ मानक भाषाएं दिखाई देती हैं जो निरंतर अभिव्यक्तियों में शॉर्ट-सर्किटिंग ऑपरेटरों की झूठी शाखा में गैर-निरंतर अभिव्यक्ति ठीक होनी चाहिए, लेकिन IANALL।

+3

दुर्घटनाओं से आपका मतलब है कि कंपाइलर क्रैश या प्रोग्राम क्रैश हो जाता है? – user4581301

+0

सी ++ 17 के मानक सेट के साथ नवीनतम वीसी (1 9 .12.something) में और स्तर 4 पर सेट की गई चेतावनियां मुझे '+' – SoronelHaetir

+2

पर संदिग्ध ऑपरेटर मिलता है, जो क्लैंग बग की तरह दिखता है, क्लैंग हेड डायग्नोस्टिक प्रदान नहीं करता है [देखें यह ive] (https://wandbox.org/permlink/2I7TE8WOTzZvmeZC) भाषा [सशर्त के अनियमित हिस्से में लैम्बडा का समर्थन करती है] (https://stackoverflow.com/q/22232164/1708801) –

उत्तर

0

यह प्रोग्राम अच्छी तरह से गठित है।

सी ++ 17 के बाद नोट, एक लैम्बडा अभिव्यक्ति कोर निरंतर अभिव्यक्ति में स्वीकार की जा सकती है भले ही इसका मूल्यांकन किया जाए। विस्तार के लिए आप प्रस्तावित पेपर N4487 देख सकते हैं।

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