tag:blogger.com,1999:blog-3636872937372639901.post1152935884643650090..comments2024-03-29T16:37:25.385+09:00Comments on 本の虫: C++0xにおけるPODの定義江添亮http://www.blogger.com/profile/13387122818743087721noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-3636872937372639901.post-12382981088804319892010-06-10T11:46:52.400+09:002010-06-10T11:46:52.400+09:00まあ、それもあるんですけどね。まあ、それもあるんですけどね。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-74838099092599118212010-06-10T08:08:14.985+09:002010-06-10T08:08:14.985+09:00>これまでPODに拘る理由というのは、memcpyなどで単純なバイト列のコピー出来るかどうかである。...>これまでPODに拘る理由というのは、memcpyなどで単純なバイト列のコピー出来るかどうかである。<br />いいえ、C言語と受け渡しするためです。<br />memcpyができることはその要件の一つに過ぎません。<br />CとC++の両方で矛盾なく扱えるためにはtrivialとstandard-layoutの両方が必要です。つまりPODです。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-62942590343134676402010-06-10T03:02:10.010+09:002010-06-10T03:02:10.010+09:00うへ、これは気がつかなかった。うへ、これは気がつかなかった。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-88317233177702409602010-06-10T01:23:06.950+09:002010-06-10T01:23:06.950+09:00同じく n3092 で記載箇所の確認をしています。
クラスが trivially copyable...同じく n3092 で記載箇所の確認をしています。<br /><br />クラスが trivially copyable class となるための条件は 9 [class] p5 に<br />記載されていて、それによると non-trivial なムーブ・コピーコンストラクタ<br />および代入演算子を持たないことが必要となります。そして<br />ムーブ・コピーコンストラクタが trivial となる条件については<br />12.8 [class.copy] p13 に、ムーブ・コピー代入演算子については同じく<br />p27 に条件が記載されています。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-88358933381687092292010-06-09T14:05:16.428+09:002010-06-09T14:05:16.428+09:00has no base classes with non-static data membersの解...has no base classes with non-static data membersの解釈を間違えました。<br />trivially copyable classのコンストラクタや代入演算子については、まあ、この程度の説明で、実用上問題ないかと思ったので、こう書きました。<br /><br />trivially copyable classが仮想関数や仮想基本クラスを持てないというのは、どこに書いてあるのでしょうか。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-39753029953607580532010-06-09T11:09:56.057+09:002010-06-09T11:09:56.057+09:00いくつか間違いと思われる記述が見られたので、 n3092 と照らし合わせ
ながらの突っ込みを入れてお...いくつか間違いと思われる記述が見られたので、 n3092 と照らし合わせ<br />ながらの突っ込みを入れておきます。<br /><br />> PODは、trivial classかつstandard-layout classであること。<br /><br />"POD class とは~" ですね。 POD はこのほかに Scalar type や、それらの<br />配列も含みます。<br /><br />> trivially copyable class<br /><br />実際にはコピー、ムーブコンストラクタと代入演算子が trivial でなければ<br />ならず、そのためにはすでに挙げられている条件に加えて、クラスが仮想関数も<br />仮想基底クラスも持たないこと、以上の条件をすべての基底クラスと<br />非 static データメンバも満たすこと、が必要になるようです。<br /><br />> コンストラクタもtrivialであること。 trivialであるということは ...<br /><br />「デフォルトコンストラクタ」ですね。で、デフォルトコンストラクタが<br />trivial であるための条件についても上記のコピー・ムーブと同様に<br />仮想関数を持たないことなど追加の条件があります。<br /><br />> 継承をしている場合、 ... 非staticなデータメンバーを持つこと<br /><br />基底クラスすべてが非 static データメンバを持たない場合は、派生した<br />クラスが非 static データメンバを持ってもいいようです。<br /><br />> 非staticなデータメンバーを持つ同じクラスを、複数継承しないこと。<br /><br />これがどこから出てきたのかわかりませんが、ドラフトのとおりの列挙順なら<br />そこにある条件は、一番初めの非 static データメンバと同じ型の基底クラスを<br />持たないこと、となっています。<br /><br />> memcpyでコピー出来るクラスの制限は、 ... 仮想関数があってもいい。<br /><br />2点目として挙げたコピー・ムーブを trivial とするための条件に仮想関数も<br />仮想基底クラスも持たないことが含まれるので、そうはいかないようです。Anonymousnoreply@blogger.com