क्या निम्न प्रोग्राम सख्त एलियासिंग नियम का उल्लंघन करता है?सख्त एलियासिंग उल्लंघन
#include <cstdint>
int main()
{
double d = 0.1;
//std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
//auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation
auto nptr{reinterpret_cast<std::int64_t*>(&d)};
auto& n{*nptr};
++n;
}
कोई चेतावनी VS2015, clang या gcc द्वारा उत्सर्जित।
पुन "सख्त [एलियासिंग] के उल्लंघन यूबी हैं", बिलकुल नहीं। सख्त एलियासिंग एक जीसीसी धारणा है जो इसके अनुकूलन से जुड़ा हुआ है। इसके बजाय सी ++ मानक के नियम हैं कि पोर्टेबल तरीकों में पुनरावृत्ति के परिणामों का उपयोग कैसे किया जा सकता है (या नहीं)। इस उदाहरण में औपचारिक यूबी का कारण बनता है। लेकिन उदाहरण किसी दिए गए प्लेटफॉर्म पर अच्छा हो सकता है। –
@ चीयर्संधथ.-अल्फ: "* सी ++ मानक के बजाय नियम हैं कि पोर्टेबल तरीकों में पुनरावृत्ति के परिणामों का उपयोग कैसे किया जा सकता है (या नहीं)। *" और उन नियमों को आम तौर पर "सख्त एलियासिंग नियम" कहा जाता है; यह शब्द जीसीसी विकल्प से आ सकता है, लेकिन नियम स्वयं नहीं करते हैं। तो मुझे नहीं लगता कि आपका मुद्दा क्या है। और नहीं, उदाहरण किसी भी मंच पर अच्छी तरह से परिभाषित व्यवहार होने की अनुमति नहीं है। 3.10/10 आपको सूचकांक के माध्यम से 'int64_1'' के माध्यम से कभी भी * डबल 'के मान तक पहुंचने की अनुमति नहीं देता है। –
दृश्य यह है कि सी और सी ++ * विशिष्ट प्लेटफॉर्म पर पनिंग टाइप नहीं कर सकते हैं वास्तविकता के विपरीत है। इसलिए प्रतिक्रिया का एक बहुत अच्छा उदाहरण है जिसे मैंने इंगित करने का प्रयास किया था। दुर्भाग्य से यह दृश्य g ++ बनाता है (और एक प्लग-इन प्रतिस्थापन के रूप में झुकाव) कम व्यावहारिक रूप से उपयोगी हो सकता था। –