うえ
(19:56:30)[おおいわ] ふーむ
(19:56:59)[UMB] =で書くほうはコピーコンストラクタとして扱われるように読めるんだが<ARM
(19:57:01)[おおいわ] C だと関数定義で C++ だとポインタ定義か> int (*p)(x)
(19:57:03)[UMB] もう少しちゃんと読むか
(19:57:04)[ったく] Cの場合はK&R C互換機能が仕様に入ってるから。
(19:57:12)[おおいわ] あーそうね
(19:57:25)[おおいわ] 全く省略できないんだっけ?
(19:57:29)[ったく] そう
(19:57:41)[ったく] 処理系依存機能として省略通すように作ってもいいけど
(19:57:41)[おおいわ] f() の解釈が違うのは覚えてたけど。
(19:57:47)[おおいわ] ふむ
(19:57:56)[おおいわ] じゃぁ
(19:57:56)[ったく] それで正しい構文が間違って解釈されたらコンパイラのバグ
(19:58:00)[おおいわ] x が typedef だと
(19:58:07)[おおいわ] 関数になるのか(笑)
(19:58:13)[ったく] でしょう。
(19:58:20)[ったく] 多分
(19:58:21)[おおいわ] ていうかだれあんな構文つくったやつ(笑)
(19:58:28)[UMB] コンストラクタをもったクラスのオブジェクトは、括弧で囲まれた式の並びで初期設定できる。
(19:58:45)[UMB] この式の並びは、初期設定を行うためのコンストラクタ呼び出しに対する引数並びと考えられる
(19:58:52)[おおいわ] そこはどうでもいいのでは
(19:59:17)[UMB] 一方、=演算子を使って、初期設定子として1つの値を指定することもできる。この値はコピーコンストラクタの引数として用いられる。
(19:59:32)[おおいわ] (19:59:40)[おおいわ] copy constructor はないのか……
(20:00:00)[UMB] auto_ptrはT*からコンストラクタできて、auto_ptr<T>&からコピーコンストラクトできるけど
(20:00:08)[UMB] T*からはコピーコンストラクトできんから
(20:00:22)[UMB] =のほうはエラーということかな
(20:00:55)[UMB] なんかうそっぽいなぁ
(20:00:56)[UMB] うう
(20:00:58)[おおいわ] (20:01:18)[おおいわ] えーと
(20:01:21)[おおいわ] /s どくしょ
(20:02:15)[tea] 毒書
(20:03:14)[おおいわ] ていうか
([ItaO@ahmad.is.s.u-tokyo.ac.jp] logged out @ 2002-08-27(Tue) 20:03:30 JST)
(20:03:51)[おおいわ] (19:47:27)[おおいわ] auto_ptr<Hoge> pHoge = new Hoge;
(20:03:55)[おおいわ] これは
(20:04:10)[おおいわ] auto_ptr<Hoge> pHoge = auto_ptr<Hoge>(new Hoge);
(20:04:12)[おおいわ] だよね?
(20:04:14)[おおいわ] 通らない?
(20:04:28)[おおいわ] explicit とかそっちの話はともかく。
(20:04:39)[UMB] ああ、そう書けば通るか。よーするにそうかかんのがいかんのだな
(20:04:47)[おおいわ] いやだから
(20:04:59)[おおいわ] そう書かなくてもそうなるのが = の初期化の規則なんだけど。
(20:05:12)[UMB] そうなのか
(20:05:13)[GANA] それってコピーコンストラクタが呼ばれてしまうのでは?
(20:05:41)[おおいわ] 呼ばれて困るの?
(20:05:42)[ったく] ほんとに呼ぶコード吐くコンパイラは
(20:05:47)[ったく] 即刻捨てていいよ
(20:05:48)[ったく] ゴミ
(20:05:49)[おおいわ] optimize できることになってるよね
(20:06:00)[ったく] 少なくともARMの時代には
(20:06:04)[GANA] そうだったのか。
(20:06:07)[ったく] aliasだと説明してあったはず
(20:06:24)[ったく] 最近はそれこそexplicitまわりが新設されたせいで
(20:06:28)[ったく] 説明の仕方が変わってるのかもね
(20:06:37)[ったく] いずれにせよほんとにそんなコードはくコンパイラはゴミ
(20:06:41)[おおいわ] (20:06:46)[おおいわ] explicit constructor は
(20:06:54)[おおいわ] = の右辺に適用されない
(20:07:06)[おおいわ] ので
(20:07:24)[おおいわ] auto_ptr<Hoge>(T*) が explicit なら
(20:07:39)[おおいわ] = 初期化は通らないことになるのかな?
(20:07:41)[おおいわ] でもそうすると
(20:07:55)[おおいわ] () でも呼べないはずだな……
(20:08:04)[おおいわ] ちがうか
(20:08:10)[おおいわ] () だと呼べるのかな……
(20:08:18)[はらだ] どういうエラーが出るんだろ
(20:08:21)[UMB] コピーコンストラクタがあるから()だととおるのでは
(20:08:25)[おおいわ] 関係ない
(20:08:30)[UMB] 関係ないのか
(20:08:31)[おおいわ] >コピーコンストラクタ
(20:08:58)[おおいわ] String s2(10) は explicit に String(int) を呼んでいると解釈しているみたいだな
(20:09:10)[おおいわ] String s2 = 10 は implicit に String(int) を呼んでいると。
(20:09:39)[おおいわ] /s すとらうすとらっぷ3版(英語) 284p
(20:10:07)[tea] かく語りき
(20:10:13)[ったく] というわけで結論として適宜両方の形式を使い分けろと
(20:10:15)[ったく] そういうことですか:-)
(20:10:16)[UMB] だいぶ違うぞ :-)
(20:10:24)[おおいわ] ていうかもんだいは
(20:10:37)[おおいわ] なんで auto_ptr<T>(T*) が explicit なのか
(20:10:40)[おおいわ] ということだよなぁ……
(20:10:50)[ったく] 暗黙に変換されちゃうと
(20:10:59)[ったく] 所有権が勝手に移動されてメモリ二重解放されるバグの温床になるから
(20:11:24)[おおいわ] うーむ
(20:11:34)[おおいわ] でもなぁ(笑)
(20:11:52)[おおいわ] ↑で = 使えないのは結構アレだよねぇ(笑)
(20:12:01)[UMB] いやいいんじゃないの
(20:12:03)[おおいわ] というわけで
(20:12:09)[おおいわ] 結論としては
(20:12:12)[ったく] explicitコンストラクタが初期化子に使えないという仕様自体が
(20:12:14)[ったく] どうなのかね:-)
(20:12:28)[おおいわ] 使えないわけじゃない
(20:12:35)[ったく] いやだから = 形式で。
(20:12:38)[おおいわ] そうね
(20:12:45)[おおいわ] String s1 = 'a';
(20:12:49)[UMB] =形式も()形式も同じ意味にしていただきたいものだ
(20:12:54)[おおいわ] がイヤだ
(20:12:56)[おおいわ] と書いてあるね
(20:13:06)[おおいわ] 'a' → int で
(20:13:17)[おおいわ] 65 文字分の領域確保されるとアレなので
(20:13:25)[おおいわ] explicit で通らないようにしている
(20:13:28)[tea] :D~
(20:13:30)[おおいわ] とか書いてあるなぁ>ここの例
(20:13:34)[UMB] なんじゃそりゃ
(20:13:37)[ったく] String s1('a'); は?:-)
(20:13:42)[おおいわ] ねぇ(笑)
(20:13:45)[ったく] ひどいな:->
(20:13:50)[UMB] その例はあまり説明になってないきがするな
(20:13:56)[くりす] 97文字じゃないのか
(20:14:01)[おおいわ] む :>
(20:14:03)[tea] 気がついている。
(20:14:05)[UMB] まにあが
(20:14:13)[おおいわ] ちなみに原典は
(20:14:20)[おおいわ] make s a string with int('a') elements
(20:14:23)[おおいわ] とかかいてある
(20:14:31)[おおいわ] EBCDIC にやさしい書き方だ(ぉ
(20:14:35)[ったく] むしろcharのコンストラクタを定義して
(20:14:38)[ったく] privateにすべきだよな(笑)
(20:14:40)[ったく] ひでえよ(笑)
(20:14:40)[おおいわ] (笑)
(20:14:58)[おおいわ] 宣言だけでいい?
(20:15:00)[ったく] いい
(20:15:02)[おおいわ] ふむ。
(20:15:04)[ったく] 基本テクニック
(20:15:09)[UMB] 第3番
(20:15:16)[ったく] …だと思う(ぉ
(20:15:16)[おおいわ] (20:15:18)[おおいわ] そうすると
(20:15:21)[ったく] C++の仕様はうかつに断言できん(笑)
(20:15:23)[おおいわ] 何のための explicit なの?
(20:15:27)[おおいわ] という話だよねぇ
(20:15:38)[UMB] ほえ
(20:15:44)[ったく] やっぱ仕様が間違ってるってことだと思うけどな
(20:15:44)[tea] やはり僕にはC++は無理だな。
(20:15:46)[おおいわ] 初期化で防ぐ理由はなさそうだよね
(20:15:48)[ったく] まあ決まったものはしょうがない:-)
(20:16:01)[おおいわ] でさぁ
(20:16:05)[おおいわ] auto_ptr<T> も
(20:16:27)[おおいわ] うーん
(20:16:29)[おおいわ] これは
(20:16:33)[おおいわ] 代入は防ぎたいのか
(20:20:19)[おおいわ] ふむ
(20:21:06)[おおいわ] あれ?
(20:21:21)[おおいわ] C(t) と C(C) と operator=(t) があるときに
(20:21:30)[おおいわ] C x = (t)hoge;
(20:21:37)[おおいわ] はどういう風に展開されるんでしたっけ
(20:22:08)[tea] はて。
(20:25:49)[ったく] x.C(C(t))
(20:25:52)[ったく] == x.C(t)
(20:26:02)[おおいわ] C x(hoge) になったな
(20:26:07)[おおいわ] ふむ
(20:26:19)[ったく] ただしエラーチェックはあるんじゃないのかな
(20:26:33)[ったく] コピーコンストラクタをprivateにしとくとエラーになるかも
(20:27:01)[おおいわ] > #include <cstdio>
(20:27:01)[おおいわ] > 
(20:27:01)[おおいわ] > struct C {
(20:27:01)[おおいわ] >   int x;
(20:27:01)[おおいわ] >   C(const C &y) {
(20:27:01)[おおいわ] >     x = y.x;
(20:27:01)[おおいわ] >     printf("COPY\n");
(20:27:01)[おおいわ] >   }
(20:27:01)[おおいわ] > 
(20:27:01)[おおいわ] >   C(int y) {
(20:27:01)[おおいわ] >     x = y;
(20:27:01)[おおいわ] >     printf("INIT_INT\n");
(20:27:01)[おおいわ] >   }
(20:27:01)[おおいわ] > 
(20:27:01)[おおいわ] >   private:
(20:27:01)[おおいわ] >   C &operator=(int y) {
(20:27:01)[おおいわ] >     x = y;
(20:27:01)[おおいわ] >     return *this;
(20:27:01)[おおいわ] >     printf("OP=\n");
(20:27:01)[おおいわ] >   }
(20:27:01)[おおいわ] > };
(20:27:01)[おおいわ] > 
(20:27:01)[おおいわ] > int main(void) {
(20:27:01)[おおいわ] >   C x = 3;
(20:27:01)[おおいわ] >   x = 5;
(20:27:01)[おおいわ] > }
(20:27:05)[おおいわ] これで
(20:27:09)[おおいわ] 代入だけエラーにできたな
(20:27:26)[ったく] (20:27:01)[おおいわ] >   C(const C &y) {
(20:27:28)[おおいわ] COPY が出ないのはあたしが間違ってるか
(20:27:30)[ったく] これもprivateにしたら?
(20:28:02)[ったく] COPYは標準的なsemanticsを仮定してコンパイラは除去してもいいので
(20:28:04)[ったく] 出なくて当然だな
(20:28:10)[おおいわ] ふむ
(20:28:14)[おおいわ] 副作用まで消していいのね
(20:28:16)[ったく] そう
(20:28:19)[おおいわ] OK
(20:28:31)[おおいわ] private にしたら上のエラーはちゃんと出た
(20:28:38)[あぶら] というかそういう副作用に依存するようなのは
(20:28:40)[あぶら] かいちゃだめ
(20:28:44)[ったく] というわけでエラーチェックだけやって最適化される
(20:28:45)[あぶら] というルールじゃないかにょ
(20:28:47)[おおいわ] ふむ
(20:28:52)[おおいわ] まぁ確認
(20:28:52)[おおいわ] (20:28:59)[おおいわ] operator= をつくれば
した
れろ