としてはstd::launder
は未定義の動作(UB)を回避するために使用されなければならないfolowingユースケースには、P0532R0で説明:"ランドリー"はポインタ算術によって伝播されていますか?
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
をプッシュベクトルをクリアしてから)2の新しいX
押すと何が起こるでしょうか?
'アサート(P0 [1] == 43)ではない;'無効式? ...部分式 'p0 [1]'によって生成されるクラス型がオーバーロードされない 'operator ==(X、int)' – WhiZTiM
@WhiZTiMを明らかにしているのは明らかです。 – Barry
それは本当にタイプミスでした。 – Oliv