इस कोड में अभिव्यक्ति b
एक कोर निरंतर अभिव्यक्तियह अभिव्यक्ति निरंतर अभिव्यक्ति क्यों नहीं है?
int main()
{
constexpr int a = 10;
const int &b = a;
constexpr int c = b; // here
return 0;
}
के बाद से मानक कहते हैं (8.20, पैरा 2 [expr.const] n4700 में)
कोई व्यंजक
e
है किया जाएगा कोर निरंतर अभिव्यक्ति जब तकe
का मूल्यांकन निम्न अभिव्यक्तियों में से एक का मूल्यांकन करेगा:
...
एक lvalue करने वाली rvalue रूपांतरण (7.1) जब तक यह
लिए आवेदन किया है ...
एक गैर अस्थिर glvalue जो को संदर्भित करता है जो एक गैर-अस्थिर वस्तु है जो कॉन्स्टेक्स के साथ परिभाषित किया गया है, या जो इस तरह के ओ-म्यूटेबल सबोबजेक्ट को संदर्भित करता है bject, या
पहले, उपरोक्त कोड में अभिव्यक्ति b
एक lvalue (जो भी एक glvalue है) के बाद से यह एक संदर्भ है, जिससे एक चर (8.1.4.1, अनुच्छेद 1 की जा रही है [expr.prim.id.unqual]):
अभिव्यक्ति एक lvalue यदि इकाई एक समारोह, चर, या डेटा के सदस्य और एक prvalue अन्यथा है; यदि पहचानकर्ता थोड़ा-क्षेत्र (11.5) निर्दिष्ट करता है तो यह थोड़ा सा क्षेत्र है।
दूसरा, वस्तु चर b
को दर्शाता है a
है, और यह constexpr
साथ घोषित की गई। हालांकि, जीसीसी शिकायत
./hello.cpp: In function ‘int main()’:
./hello.cpp:6:20: error: the value of ‘b’ is not usable in a constant expression
constexpr int c = b;
^
./hello.cpp:5:13: note: ‘b’ was not declared ‘constexpr’
const int &b = a;
जहां तक मेरा बता सकते हैं, एक संदर्भ एक वस्तु नहीं है, तो ऊपर गोली जाहिरा तौर पर पता चलता है कि a
constexpr
के साथ घोषित किया जाएगा। क्या मैं कुछ भूल रहा हूँ? जीसीसी के साथ मैं सहमत नहीं हूं कि जीसीसी b
को एक ऑब्जेक्ट के रूप में देखता है, जिसके लिए इसे constexpr
के साथ घोषित करने की आवश्यकता होती है। हालांकि, b
एक वस्तु नहीं है!
क्लैंग जीसीसी के साथ सहमत है। लेकिन मुझे लगता है कि मैं आपसे सहमत हूं, यह मानक या कंपाइलरों में एक दोष है। यह भी ध्यान में है कि एमएसवीसी कोड स्वीकार करता है। –