इस कोड के लिए साथ 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
इस खंड के प्रयोजनों के लिए पैरामीटर के रूप में गिना जाता है या नहीं।
मुझे संदेह है कि इस तरह के एक सदस्य समारोह वास्तव में उपयोगी हो सकता है, क्योंकि यह निश्चित रूप से संकलन समय में गणना नहीं की जा सकती है, है ना? तो मैं कहूंगा, जीसीसी निदान अधिक सही है। – user3159253
यह सुनिश्चित करने के लिए कि मैंने अभी एक ट्रंक जीसीसी निर्माण की कोशिश की है और यह अभी भी टूटा हुआ है। – user657267
@ user657267 ठीक है। शायद यह एक उच्च प्राथमिकता नहीं है; उपयोगकर्ता 3159253 अंक के रूप में, यह कोड बहुत उपयोगी नहीं है क्योंकि 'f()' का मूल्यांकन वास्तव में गैर-कॉन्स्टेक्सर होगा, यहां तक कि क्लैंग में भी, क्योंकि 'एस' एक शाब्दिक प्रकार नहीं है (इसलिए 'कॉन्स्टेक्स एस एस (1); अनुमति नहीं है)। –