2015-10-07 10 views
30

एक लैम्ब्डा कब तुच्छ होने की गारंटी है, अगर कभी?लैम्ब्डा तुच्छ कब होता है?

मुझे लगता है कि अगर यह केवल मामूली प्रकार या कुछ भी नहीं लेता है, तो यह मामूली होगा। हालांकि मेरे पास वापस करने के लिए कोई मानक-ese नहीं है।

मेरी प्रेरणा विजुअल सी ++ 12 से 14 के कुछ कोड को स्थानांतरित करने में थी और लैम्बडास से निपटने के दौरान कुछ स्थैतिक आवेषण विफल हुए, मुझे लगता है कि मैं तुच्छ माना जाता हूं।

उदाहरण:

#include <type_traits> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    auto lambda = [](){}; 

    cout << boolalpha << is_trivially_copyable<decltype(lambda)>{} << endl; 
} 

यह vs140 पर false लेकिन vs120 और बजना में true पैदा करता है। जीसीसी> = 5 के आसपास होने के कारण मैं जीसीसी का परीक्षण नहीं कर सका। मुझे उम्मीद है कि यह बनाम40 में एक प्रतिगमन है, लेकिन मैं यहां सही व्यवहार का निश्चित नहीं हूं।

+4

जीसीसी 5.2 भी 'सत्य' उत्पन्न करता है: [डेमो] (http://coliru.stacked-crooked.com/a/a7dc4ee4e32fb70a) – Jarod42

उत्तर

30

मानक यह निर्दिष्ट नहीं करता है कि बंद प्रकार (लैम्ब्डा अभिव्यक्ति का प्रकार) छोटा है या नहीं। यह स्पष्ट रूप से कार्यान्वयन के लिए इसे छोड़ देता है, जो इसे गैर पोर्टेबल बनाता है। मुझे डर है कि आप अपने static_assert पर निर्भर नहीं हो सकते हैं जो कुछ भी संगत है।

का हवाला देते हुए सी ++ 14 (N4140) 5.1.2/3:

... एक कार्यान्वयन अलग तरह से क्या नीचे प्रदान वर्णन किया गया है से बंद प्रकार परिभाषित कर सकते हैं इस बात का प्रत्यक्ष व्यवहार में परिवर्तन नहीं करता कार्यक्रम बदलकर अलावा अन्य:

  • आकार और/या बंद करने के प्रकार के संरेखण,
  • कि क्या बंद प्रकार तुच्छता copyable है (धारा 9),
  • क्या बंद प्रकार मानक-लेआउट वर्ग (क्लॉज 9), या
  • है कि बंद प्रकार एक पीओडी वर्ग (क्लॉज 9) है या नहीं।

...

(जोर मेरा)

कि वाक्य में डबल निषेध पार्स करने के बाद, हम देख सकते हैं कि कार्यान्वयन तय करने के लिए बंद करने के प्रकार तुच्छता copyable है की अनुमति दी है, मानक लेआउट, या पीओडी।

+0

वैसे मेरे लिए बहुत दुखद है :(मैं उस जवाब की अपेक्षा नहीं कर रहा था मुझे लगता है कि मैंने धारणा बनाने के बारे में कोई सबक नहीं सीखा। – tahsmith

13

मसौदा मानक के अनुसार N45275.1.2/3 लैम्ब्डा भाव [expr.prim.lambda] (जोर मेरा):

लैम्ब्डा अभिव्यक्ति के प्रकार (जो भी है क्लोजर ऑब्जेक्ट का प्रकार) एक अद्वितीय, अज्ञात nonunion क्लास प्रकार है - जिसे बंद करने का प्रकार कहा जाता है - जिनकी गुण नीचे वर्णित हैं। यह वर्ग प्रकार न तो कुल (8.5.1) है और न ही एक शाब्दिक प्रकार (3.9) है। बंद प्रकार को सबसे छोटे ब्लॉक स्कोप, कक्षा स्कोप, या नामस्थान स्कोप में घोषित किया गया है जिसमें संबंधित लैम्ब्डा-अभिव्यक्ति शामिल है। [ नोट: यह नाम प्रकार (3.4.2) के साथ से जुड़े नामस्थानों और वर्गों का सेट निर्धारित करता है। लैम्बडेडक्लेटर के पैरामीटर प्रकार इन संबंधित नेमस्पेस और कक्षाओं को प्रभावित नहीं करते हैं। - अंत टिप्पणी] कार्यान्वयन अलग ढंग से क्या नीचे वर्णित है प्रदान की इस में परिवर्तन नहीं करता बंद प्रकार परिभाषित कर सकते हैं कार्यक्रम के नमूदार व्यवहार को बदलने के अलावा किसी और:

(3,1) - आकार और/या बंद प्रकार के संरेखण,

(3,2) - कि क्या बंद प्रकार तुच्छता copyable है (धारा 9),

(3,3) - बंद प्रकार एक मानक लेआउट वर्ग है कि क्या (धारा 9), या

(3.4) - चाहे बंद प्रकार एक पीओडी वर्ग (क्लॉज 9) है।

कार्यान्वयन नहीं

इस प्रकार बंद प्रकार के rvalue संदर्भ प्रकार के सदस्यों को जोड़ने जाएगा, यह कार्यान्वयन निर्भर है।

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