Kazutoshi SATODA
Kazutoshi SATODA
すいません。タイトル編集中に Enter 押して投稿しちゃいました。 そして「D2 と B2 とは同じアドレスに配置できない」を https://wandbox.org/permlink/TXzhIeQcQB1kBJF6 (Clang 10.0.0) で確認すると、 同じアドレスに配置されてしまったので、これは嘘であることがわかりました。 ただ、素朴な実装(僕が想定してた実装)では B2 は sizeof(B1) だけずれたアドレスに配置されることが考えられたりして、 やっぱりこれらがポインタ相互交換可能と規定されている(= Empty base optimization が強制されている)ことは無いんじゃないかと思ってはいます。 ここは引き続き考えてみます。
・・・ C++20 から standard-layout class では EBO 強制されそうな文面変更が入ってました。 https://github.com/cplusplus/draft/commit/7327e8a586accbd1d8a977f650e331b9af051c21#diff-1af4d71ef5ad926811860a77248c93e339ce46a030e6f123ad1f4661cc6e12fbR803-R806 でも元になった issue https://wg21.cmeerw.net/cwg/issue2254 は first non-static data member がビットフィールドであった場合を問題とするもので、 関係ない仕様変更が混ざってるように見える・・・。 この変更などから関連する規格文面の "non-static data members" が実際には "*direct* non-static data members" を意味している文面不備の可能性もありそうに見えてきて、 先に挙げた...
standard-layout class での EBO 強制は C++11 (n2342: POD's Revisited) から意図された変更として採択となっていました。 認識不足でした。 http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2007/n2342.htm#ABI (via https://stackoverflow.com/a/10789707) > Allowing standard-layout classes to have base classes forces compilers to implement the empty base optimization...
`is_pointer_interconvertible_base_of_v` と `is_standard_layout_v && is_base_of_v` との違いを 考えていたら下記のような場合に `is_pointer_interconvertible_base_of_v` が真となるべきかどうか、 規格からすっきり読み取れない感じになってきました。 ```cpp struct B {}; struct D : B { int m; }; ``` アドレスが同じになることまでは要求されていることや m さえなければ真になるというのも半端な気がしたことから、 規格文面がおかしい可能性もありそうだったので std-discussion に質問を投げてみました。 https://lists.isocpp.org/std-discussion/2020/12/0921.php
@yumetodo 僕がもらった返信への(僕からの)返信だけ ML 上で見えてる状態です。 std-discussion を CC に含めて返信してもらったようなんですが、おそらく ML 参加アドレス以外からの投稿は受け付けられない 設定になってるんだと思います。
[N4839](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4839.pdf) (WG21 2019-11 Belfast Minutes of Meeting) の CWG Motions で、 DR として適用するものは "accept as Defect Reports" と明記され、 そうでないものは "apply the changes" と書き分けられていることから、 P1971R0 の変更は DR ではなく C++20 での変更と見ています。 >...