2016-04-08 9 views
5

इस कोड के लिए साथ constexpr गैर स्थिर सदस्य समारोह:गैर constexpr निर्माता (जीसीसी, बजना अलग)

struct S 
{ 
    S(int m): m(m) {} 
    constexpr int f() const { return m; } 

    int m; 
}; 

int main() { S s(1); } 

यह 3.6, 3.7 और 3.8 -std=c++14 साथ बजना द्वारा कोई चेतावनी या त्रुटियों के साथ संकलित किया गया है। लेकिन जी ++ 5.x में निम्नलिखित त्रुटियां होती हैं:

main.cpp:4:19: error: enclosing class of constexpr non-static member function 'int S::f() const' is not a literal type 
    constexpr int f() const { return m; } 
      ^
main.cpp:1:8: note: 'S' is not literal because: 
struct S 
     ^
main.cpp:1:8: note: 'S' is not an aggregate, does not have a trivial default constructor, and has no constexpr constructor that is not a copy or move constructor 

कौन सा कंपाइलर सही है और क्यों?

मैंने सी ++ 14 [dcl.constexpr]/3 में आवश्यकताओं को देखा जो कहता है कि constexpr फ़ंक्शन "इसके प्रत्येक पैरामीटर प्रकार का एक शाब्दिक प्रकार होगा", लेकिन वह अनुभाग स्पष्ट रूप से सदस्य कार्यों का उल्लेख नहीं करता है , और यह नहीं कहता कि अंतर्निहित *this इस खंड के प्रयोजनों के लिए पैरामीटर के रूप में गिना जाता है या नहीं।

+0

मुझे संदेह है कि इस तरह के एक सदस्य समारोह वास्तव में उपयोगी हो सकता है, क्योंकि यह निश्चित रूप से संकलन समय में गणना नहीं की जा सकती है, है ना? तो मैं कहूंगा, जीसीसी निदान अधिक सही है। – user3159253

+0

यह सुनिश्चित करने के लिए कि मैंने अभी एक ट्रंक जीसीसी निर्माण की कोशिश की है और यह अभी भी टूटा हुआ है। – user657267

+0

@ user657267 ठीक है। शायद यह एक उच्च प्राथमिकता नहीं है; उपयोगकर्ता 3159253 अंक के रूप में, यह कोड बहुत उपयोगी नहीं है क्योंकि 'f()' का मूल्यांकन वास्तव में गैर-कॉन्स्टेक्सर होगा, यहां तक ​​कि क्लैंग में भी, क्योंकि 'एस' एक शाब्दिक प्रकार नहीं है (इसलिए 'कॉन्स्टेक्स एस एस (1); अनुमति नहीं है)। –

उत्तर

6

यह एक कोर दोष उस के लिए सी ++ 14

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1684

बजना तय किया गया था

https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6jM8M8FUs30

वहाँ जीसीसी के लिए एक नजर है समझौता किया गया है, लेकिन यह किसी को भी तरह नहीं दिखता है ने इसे अभी तक संबोधित किया है

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66297

+0

क्या यह केवल _static_ सदस्य कार्यों के लिए लागू नहीं है? – user3159253

+0

डीआर पर टिप्पणियां बताती हैं कि पिछला व्यवहार गैर स्थैतिक सदस्य के लिए था और यह परिवर्तन स्थैतिक सदस्य को ठीक करने का इरादा था ... लेकिन वास्तविक परिवर्तन दोनों पर लागू होता प्रतीत होता है। साज़िश का गहरा जाना? –

+0

असल में मेलिंग सूची लिंक बताता है कि समिति ने जानबूझकर गैर स्थैतिक के लिए इसे हटाने का फैसला किया, डीआर मूल रूप से –

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