メモリを再割り当てせずにオブジェクトをインプレースで置き換えることを目的としたコードに出くわしました。
static void move(void* const* src, void** dest) {
(*reinterpret_cast<T**>(dest))->~T();
**reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src);
}
これは、オブジェクトが破棄されてから構築されずに割り当てられるため、私にはUBのように見えます。つまり、コピー割り当て(2行目のみ)または明示的に破棄(1行目)してから配置-新しいコピー構築を行う必要があります。割り当ての代わりに。
これは私には明白なバグのように見えますが、 boost :: spirit::hold_anycdiggins::any
とそれが基づいているオリジナルの両方にしばらくの間存在していたので私は尋ねるだけです。(私はBoost開発者のメーリングリストでそれについて尋ねましたが、応答を待っている間、それが本当に間違っている場合はローカルでこれを修正したいと思います。)