正如P0532R0解釋,在如下因素用例std::launder
必須使用,以避免不確定的行爲(UB):指針算術是否傳播「洗衣」?
struct X{
const int i;
x(int i):i{i}{}
};
unsigned char buff[64];
auto p = new(buff) X(33);
p->~X();
new(buff) X(42);
p = std::launder(p);
assert(p->i==42);
但在多個對象處於緩衝的情況下發生什麼(這正是
unsigned char buff[64];
auto p0 = new(buff) X(33);
auto p1 = new(p0+1) X(34);
p1->~X();
p0->~X();
new(buff) X(42);
new(p0+1) X(43);
p0 = std::launder(p0);
assert(p0->i==42);
assert(p0[1].i==43);//???
是最後句話很正確,或p0[1]
仍引發UB:如果一個人在一個載體推動2 X
,清除載體,然後推兩個新X
)會發生什麼?
不是'assert(p0 [1] == 43);'一個無效的表達式? ...考慮到由子表達式產生的類類型'p0 [1]'沒有重載'操作符==(X,int)' – WhiZTiM
@WhiZTiM明顯的錯字顯而易見? – Barry
確實是一個錯字。 – Oliv