اشاره به آدرس یک زیرشی subobject در یک مجموعه توسط std::launder
تصور کنید که یک struct و یک union به این صورت تعریف کردید!
struct X { const int n; };
union U { X x; };
حالا فرض کنید یک شی از union U به این شکل تعریف کردید..
U u = {{ 1 }};
خوب حالا اگر بخواهید از مقدار عضو n که در struct X تعریف کردیم توسط شی u دسترسی داشته باشیم بدون اینکه آبجکت جدیدی از struct X بسازیم به روش زیر عمل میکنیم
X *p = new (&u.x) X {2};
در اینصورت حالا اشاره گری داریم که به یک عضو از union داره اشاره میکنه! پس عبارتهای زیر هم درست خواهد بود
assert(p->n == 2); // OK
حالا اگر چنین عبارتی داشته باشیم قطعا یک رفتار نامشخص خواهیم داشت در زمان اجرا...
به این علت که احتمال داره نتونیم به subObject اشاره داشته باشیم.
assert(u.x.n == 2);
حالا تو C++17 این مشکل را می توانید به راحتی با استفاده از تابع std::launder رفع کنید...
assert(*std::launder(&u.x.n) == 2); // OK