المشكلة في متناول اليد
} ؛ Union u {x x ؛ تعويم و ؛ } ؛ ... u u = {{1}} ؛هنا ، يتم تنفيذ التهيئة الإجمالية ، تعيين أول عضو في u (x) على القيمة 1. لأن n هو متغير const ، يفترض المترجم أن U.X.N سيبقى دائمًا 1. الكود:
x *p = new (& u.x) x {2} ؛
نظرًا لأن x تافهة ، يمكننا إنشاء كائن جديد في نفس الموقع القديم ، مما يجعل هذا الكود صالحًا بشكل مبدئي. سيكون للكائن الجديد الآن تعيين عضو N على 2.الآن ، لنحاول الوصول إلى U.X.N. ماذا تتوقع أن تكون النتيجة؟
struct X { const int n; }; union U { X x; float f; }; ... U u = {{ 1 }};
الواقع المؤسف
المترجم ، استنادًا إلى افتراضه بأن متغيرات const غير قابلة للتغيير ، يعمل على تحسين الكود ، مما يجعل القيمة الجديدة لـ U.X.n غير قابلة للوصول. فيما يلي مثال توضيحي:
Assert (*std :: launder (& u.x.n) == 2) ؛ // سيكون صحيحًا.
X *p = new (&u.x) X {2};
الوصول. من خلال غسل الذاكرة ، نمنع المترجم من وضع افتراضات حول محتوياته ، مما يضمن أن لدينا وصولًا دقيقًا وموثوقًا للبيانات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3