this question के संदर्भ में। कोर निरंतर अभिव्यक्ति जिसका उपयोग constexpr
वैरिएबल y
को प्रारंभ करने के लिए किया जाता है, वह खराब है। एक दिया गया है।यदि कोई कॉन्स्टेक्सर इस कोर निरंतर अभिव्यक्ति त्रुटि को प्रकट नहीं करता है तो क्यों नहीं?
लेकिन अगर मैं एक if constexpr
में if
बारी करने की कोशिश:
template <typename T>
void foo() {
constexpr int x = -1;
if constexpr (x >= 0){
constexpr int y = 1 << x;
}
}
int main(){
foo<int>();
}
त्रुटि बनी रहती है। जीसीसी 7.2 के साथ अभी भी दे रही है:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
लेकिन मैंने सोचा था कि अर्थ की जांच एक त्याग शाखा पर unpreformed छोड़ा जाना चाहिए।
एक constexpr
लैम्ब्डा के माध्यम से एक अविवेक बनाने में मदद करता है, हालांकि:
template <typename T>
void foo(){
constexpr int x = -1;
constexpr auto p = []() constexpr { return x; };
if constexpr (x >= 0){
constexpr int y = 1<<p();
}
}
y
पर constexpr
विनिर्देशक को बदलने के लिए कैसे त्याग शाखा को चेक किया गया लगता है। क्या यह इरादा व्यवहार है?
@ max66 अन्य कार्यान्वयन की जांच करने के तरह पर्याप्त था। उन्होंने बताया कि त्रुटि दोनों जीसीसी (7.2.0/हेड 8.0.0) और क्लैंग (5.0.0/हेड 6.0.0) के साथ पुन: उत्पन्न होती है।
एक संकलक बग की तरह लगता है। क्या आपने एक और कार्यान्वयन की कोशिश की है? –
@ShacharShemesh - मैं खुद नहीं है। लेकिन पोस्ट के ओपी ने रिपोर्ट की है कि [क्लैंग और एमएसवीसी वही व्यवहार करते हैं] (https://stackoverflow.com/questions/46510531/undefined-behavior-when-constexpr-evaluating-negative-bitshift#comment79975550_46510531)। – StoryTeller
मैं वैनबॉक्स से क्लैंग ++ 3.8.1 – max66