Здравствуйте, rg45, Вы писали:
R>В данном сценарии то, что происходит внутри bar — это откровенный говнокод.
В связи с тем, что можно прочитать по ссылке от ув.σ (
https://timsong-cpp.github.io/cppwp/n4868/ptr.launder#example-1):
struct X { int n; };
const X *p = new const X{3};
const int a = p->n;
new (const_cast<X*>(p)) const X{5}; // p does not point to new object ([basic.life]) because its type is const
const int b = p->n; // undefined behavior
const int c = std::launder(p)->n; // OK
я уже не могу позволить себе быть столь категоричным.
Меня даже больше интересует, а не нужно ли после возвращения из bar вот здесь:
int foo() {
const S s{1};
int i1 = s.i;
bar(s);
int i2 = s.i; // (1)
return i1 + i2;
}
сделать std::launder в точке (1). Поскольку lifetime для объекта s закончился внутри bar...