1 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 00:25:25 ] The C++ Standards Committee www.open-std.org/jtc1/sc22/wg21/ wikipedia ja.wikipedia.org/wiki/C%2B%2B0x C++0x pc11.2ch.net/test/read.cgi/tech/1149440647/ C++0x 2 pc11.2ch.net/test/read.cgi/tech/1191842951/ C++0x 3 pc11.2ch.net/test/read.cgi/tech/1204808027/
369 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:00:18 ] >>344 f.swap((a+b)*(c+d)*e); は無理だが ((a+b)*(c+d)*e).swap(f); は問題ない。
370 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:33:32 ] ああ、なるほど
371 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:17:19 ] gcc 4.4.0_alpha20080725にてテスト ソース #include <map> #include <string> #include <iostream> #include <boost/foreach.hpp> int main() { typedef std::map<std::string,int> Map; Map anim{ {"bear",4}, {"cassowary",2}, {"tiger",7} }; BOOST_FOREACH (Map::value_type v, anim) { std::cout << v.first << ':' << v.second << std::endl; } return 0; } 結果 bear:4 cassowary:2 tiger:7 とりあえずN2672の例の1つが動くことを確認。そろそろautoが欲しいなー。
372 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 06:44:55 ] ダメだ。どうしても分からんから教えてくれ。 N2710のコンセプトのドラフト、 14.9.1.4 >A concept-definition that starts with auto defines an implicit concept, otherwise it defines an explicit concept. implicitとexplicitで何が違うんだ? あちらこちらによく分からない記述が散らばっているだけでさっぱり分からん。
373 名前:372 mailto:sage [2008/08/17(日) 07:49:49 ] 自己解決 N2081に書いてあった。
374 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 03:54:18 ] >>342 それじゃ部分式の演算子関数呼び出しでコピーが発生するじゃない。
375 名前:デフォルトの名無しさん [2008/08/26(火) 13:45:43 ] nullptr があっても printf() とか可変長引数にヌルポインタ渡す時のキャストが 要らなくなったりしないよね?
376 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 15:15:42 ] void*を渡すならいらない。
377 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 18:51:22 ] tyep safe な printf まーだー?
378 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 22:34:35 ] ばらでぃっくなアレを使うんじゃ
379 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 23:55:53 ] つboost::format
380 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:03:01 ] こんなの見つけたけど次回ってもう今日だな。 ttp://d.hatena.ne.jp/faith_and_brave/20080516/1210935359
381 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 09:18:07 ] 2008-08 mailing (pre-San-Francisco)
382 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 09:34:19 ] 細かい議論が多くて面白いですね
383 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 19:34:02 ] decltypeに関数を与えると関数を表す型じゃなくて関数の戻り値を表す型になるのか。 なんだか非直感的でやだな。
384 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 21:35:59 ] 関数の型と言えばsignature
385 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 12:16:19 ] .>>383 decltypeのやっていることはsizeofとほとんど同じだからな。 むしろ、sizeofの型を返す版が欲しいっていう話だし。
386 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 13:35:48 ] typedef F decltype(f); arity<F>::value; // 引数の数 result_of<F>::type ; // 戻り値の型 arg_types<F>::type ; //引数の型リスト のようにできれば俺は満足ですよ
387 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 13:52:44 ] 何か違和感があると思ったら一行目だ。 decltypeが型としての関数を返すものだったとしてもだ、順番が間違っているぞ。
388 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 14:09:52 ] typedef FROM TO;の順番なのに… C++を使ってないのバレバレですね失礼しました
389 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 14:56:36 ] つusing TO = FROM;
390 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:54:11 ] 383を見て、decltype(printf)がintになっちゃうのかと思った。
391 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 18:55:33 ] 違うの? decltype(printf)がint(*)(const char*,...)じゃなくてintになるから 非直感的で気持ち悪いって言ってるのかと思った decltype(printf("..."))だったら当然intに決まってるし 383どういう意味?
392 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:09:39 ] 関数呼び出しせずに関数名を渡したら関数の型になるんじゃないの?
393 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:17:41 ] 当たり前。スルーで。
394 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:15:12 ] じゃ結局decltype(printf)は普通にint(*)(const char*,...)型なのね
395 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:22:28 ] いや、ポインタじゃないだろ?
396 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:22:58 ] 当たり前。スルーで。
397 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:44:52 ] >>395 アホ? C/C++の式にポインタじゃない関数型なんて存在しねえよ
398 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:51:58 ] 存在しなかったら関数呼べないだろwwwwwwwwwwwwwwwwww
399 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:56:59 ] 関数呼び出し演算子のオペランドの規定読んでから出直してこい
400 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:21:28 ] ConceptGCC 4.3.0 alpha7 でテスト #include <cstdio> #include <typeinfo> int main() { std::puts(typeid(int(const char*,...)).name()); std::puts(typeid(int(*)(const char*,...)).name()); std::puts(typeid(std::printf).name()); std::puts(typeid(decltype(std::printf)).name()); } 結果 FiPKczE PFiPKczE FiPKczE FiPKczE
401 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:28:00 ] >>397 坊やにはまだ早いよ。 C++03を学びなおしてきな。
402 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:34:35 ] えー? 関数型って&演算子のオペランド(結果は関数ポインタ)の場合しか存在しないんじゃないの? 関数ポインタには*演算子効かないから関数型って単独で取り出せないんじゃないの? (**************printf)("...")とか書けるのは何なの? ()のオペランドって関数ポインタじゃないの? わかんなくなってきた
403 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:36:41 ] >>402 スレチ
404 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:40:42 ] みんなが関数名と呼んでいるものは実は関数ポインタリテラルで、 関数ポインタというものは*や&付けても自分自身に戻る変な型で、 みんなが引数列と呼んでいる(...)は関数ポインタ(と多重定義したクラス)だけに作用する特別な演算子で 「関数」なるものはコンパイラの世界には存在しないんだよって そう教わって信じてきたのにまさかC++に関数型が存在するなんて… カルチャーショック
405 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:44:45 ] >>404 ポインタにはすべて「そのポインタが指す先の型」というものが概念的に存在する。 そういう型の変数が作れるかとか、そういう型のリテラルが書けるか、は別の問題。
406 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:45:41 ] まーC++の関数って、関数ポインタに特別な文法なしで代入できるし、 型としての関数なんて、テンプレートメタプログラミングでもしない限り扱わんし、 紛らわしいよな。
407 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:55:20 ] 待て、やっぱり変だ void foo(void(*)()){std::cout << "foo(void(*)())";} void foo(void()){std::cout << "foo(void())";} これ定義しようとしたら怒られたぞ(片方にするとどっちも通る) つまりvoid(*)()とvoid()は同じ型ってことじゃないの
408 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:00:37 ] >>407 引数の型(というか、変数の型)としては関数ポインタしかあり得ない。 そういう場所に「関数」を書いた場合は「関数ポインタ」とみなす、という規則があるため、 結果的に同じ型の引数を取る関数を宣言しようとしたと解釈されエラーになる。
409 名前:not 408 mailto:sage [2008/09/04(木) 22:05:19 ] その引数の型矯正ルールが8.3.5.3な。 とりあえずC++0xはまだ早いんじゃないのかね?
410 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:13:35 ] 1.処理系すらできてない規格に触るのなんてまだ早い 2.その程度の知識ならまずC++03の規格に一通り目を通してから、まだお前のような素人には早い dotchi?
411 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:24:47 ] 調べた なんだ&とsizeofとtypeid(と多分decltypeも)のオペランドの中が特殊なだけで その外では404の通りでいいんじゃん 関数型は出てきたそばから関数ポインタに変えられるから &とsizeofとtypeid以外の世界にはやっぱり関数型は存在しないんだ 俺は大体合ってた
412 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:28:55 ] 俺がこっそり望んでいたsealedは入りませんか? このクラスは継承するなってソースにもドキュメントにも書いてあるのに 勝手に継承されてデストラクタ呼ばれないとか文句垂れられます
413 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:29:39 ] D&Eに継承の禁止の仕方載ってる
414 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:31:15 ] 3.
415 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 23:19:54 ] >>411 boost::function<R(A)> とか boost::result_of<R(A)> とか見たこともないの?
416 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 23:22:47 ] >decltype オーバーロードしてる関数の型ってのはやっぱ無理なのか 例えばstd::fabsを引数double xで呼び出したときの(戻り値ではなく)関数の型が分かると便利なんだけど decltype( static_cast<decltype(x)(*)(decltype(x))>(std::fabs) ) てのは本末転倒な気がする
417 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 23:32:10 ] >>411 関数型をtypedefすると、 シグネチャが同じ関数を大量に宣言するときに便利だよw typedef double F(double); F sin,cos,tan,asin,acos,atan,…; ってこれC言語だからC++0x関係ないな
418 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 01:45:31 ] >>415 function, result_ofはTR1にも入っていて、 C++0xにまんま入ることが決定済み。
419 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 06:33:58 ] sizeofは『式を評価して』その式の型のサイズを返す。 decltypeも『式を評価して』その式の型を返す。 だから関数を入れたらその関数が評価されて関数の戻り値の型が返るに決まっている。 どこも非直感的ではない。
420 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 08:42:21 ] >>419 ×関数を入れたら ○関数呼び出しを入れたら
421 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 09:12:37 ] おいおい、"unevaluated operand"ってやつで、「評価」されないよ。 typeid, sizeof, decltypeの三つな。
422 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 13:12:11 ] 仮に評価したときに返ってくるであろう型、と言うべきだね
423 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 14:42:50 ] つ 「式の型」
424 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 18:25:23 ] なるほど、 int i = 0; std::cout<<sizeof(i++)<<std::endl; std::cout<<i<<std::endl; //prints 0 なわけね >>416 が気になるからage
425 名前:デフォルトの名無しさん mailto:age [2008/09/05(金) 18:28:06 ] ageてないw
426 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 19:16:48 ] 平気で未定義になるような病的な式をsizeofの中に閉じこめたりするのは TMPではよくやることだな
427 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 21:21:04 ] sizeof(0 / 0) は警告が出るな@gcc
428 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 21:57:58 ] 0除算だからな
429 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 22:35:53 ] 昔のコンパイラってTMPで0除算したら落ちたりしてたんだろうか 今でもboost vaultにあるキワモノ(例:eggとかphoenix)使ってたらエラー時に落ちるものは結構あるようだけど
430 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 23:39:59 ] >>418 ??? そんなことは百も承知だが 関数型がテンプレートの引数一つで取り扱える例を出しただけ そういや、boost::function は昔は <R, A1, A2> みたいに書いてたころも あったけな
431 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 10:22:30 ] 自意識過剰の変な奴…
432 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 13:36:46 ] 美少女中学生スレたるこのスレにはふさわしくないな
433 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 13:45:09 ] 美少女中学生の話は↓でやれ。ここでするな。 pc11.2ch.net/test/read.cgi/tech/1191754720/
434 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 19:27:25 ] 0xの可変個引数テンプレートがDのそれとよく似てるけど、どっちが先なのかな? それとももっと古くからあった?
435 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 20:49:36 ] >>434 va_argって知らないの?
436 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 20:55:47 ] >>434 先に実装したのはDだが、発想自体は別に新しいものじゃないだろ
437 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 21:22:38 ] >>435 可変個引数関数のことを言ってるんじゃないよ >>436 そうなのか。作ったタプルを転送して展開して…とか初めて見たとき、何じゃこりゃすげぇと思ったんだけどな〜
438 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 21:24:06 ] C++0xを使いこなせる自信がない。 無理だろあんなもの。疲れるだけ。
439 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 21:27:23 ] 大丈夫、苦労するのはライブラリ実装者だけだから
440 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 21:31:14 ] >>437 > 何じゃこりゃすげぇと思ったんだけどな〜 かわいいねえ。
441 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 22:53:23 ] 美少女中学生がいるな・・・
442 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 23:35:28 ] auto以外は普通の利用者には関係ないね
443 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:24:30 ] 「C++0x?D言語最強に決まってんだろwww」って言われたときのためのコピペ作ろうぜw
444 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:30:05 ] おまえDスレにいるだろ
445 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:34:07 ] 可変テンプレートは型リストの構文糖衣でいいのに
446 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:59:47 ] >>442 コンセプトでエラーメッセージがましになることが期待できるってのはないですか? 普通の利用者は自分でコンセプトを定義しないっていう点では関係ないと言えるのかもしれないけど。
447 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 02:43:39 ] D? ああ、C++とJavaの悪い所取りした哀れな言語ね
448 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 03:01:47 ] >>442 (現在STLやboostを利用するレベルの)通常のC++ユーザーにとっては、 ・auto ・initializer_list ・新型for ・lambda ・template typedef ・nullptr くらいは結構書く機会があるのでは? あと、以前も出てましたが、template同様自分で書くことはなくても、 conceptに関してはユーザー全員が理解すべきものと思います。 個人的にはあとdecltypeとそれに伴う新たな関数宣言も。
449 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 03:14:42 ] まあ、新しい関数宣言は人のソース読むときには知っとかなきゃならんな… こんなんだよな []main(int argc, char *argv[]) -> int{return 0;} きめえwwwwwwwwww 自分では絶対に書かない
450 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 03:53:18 ] >>449 これまでのパラダイムから、あまりにもかけ離れすぎてて これだったら無い方がまだマシ
451 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 04:58:26 ] こういうことしたい時に便利かも。 template <typename T> struct complex { T re; T im; template <typename T2> []operator+(const complex<T2>& rhs) -> complex<decltype(re+rhs.re)>{ /* ... */ } };
452 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 05:10:05 ] だったらこれ認めるようにすりゃいいじゃないか… complex<decltype(re+rhs.re)> operator+(const complex<T2>& rhs){ /* ... */ } rhsを宣言より前に使ってるからダメってのはわかってるよ でもそんなの戻り値型は後で解決することにすりゃいいだけじゃん
453 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 05:14:15 ] 見慣れない以外の欠点が無いならどうでもいいかと
454 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 05:57:38 ] コンストラクタとかどうなんの もしかしてこう? []Foo::Foo() -> : a(0) {} オェェェェ
455 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 08:47:11 ] N2582 って通りそうなん? >>454 コンストラクタではその書き方はできないだけだと思われ。
456 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 10:02:04 ] >>449 要は、戻り値は後ろにある方が型推論ができていいってことらしい。 あと、数学でも、関数の宣言って f: 定義域 → 値域 なのよね。 けども、この書式で、C++ でやるとキモいよな。 >>452 C++ 屋さんは LL 文法大好きだから。
457 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 13:21:18 ] 言語としての優劣はともかく、コードの視認性では最近のLLに大きく劣ることになるわけだが。
458 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 13:31:32 ] LL違うwww
459 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 13:44:26 ] C++ がそっちの意味の LL なわけねぇww
460 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 13:59:07 ] そのうち、Perl みたいに $ とか @ とか出てきそうだw
461 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 16:50:02 ] >>455 じゃあコンストラクタ、デストラクタ、変換関数は新形式では書けないって事なのかな 書ける関数と書けない関数があるような一貫性のない書き方はダメだなぁ
462 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 16:54:41 ] $と@は色んな事情で使えないってD&Eで禿が言ってた
463 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 16:55:47 ] コンストラクタは現時点でも特殊じゃん。 戻り値書かないのはコンストラクタ・デストラクタだけなんだし。 新書式の目的が戻り値の型推論だっていう目的を考えても、 戻り値のないコンストラクタに使えてもしょうがないし。
464 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 16:55:52 ] もう[]に別の意味を付けるのはやめて! []のHPは0よ!
465 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:02:29 ] それを言ったらC++のHPは(ry
466 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:14:28 ] >>448 あとコンストラクタ関係(委譲、default/delete)は便利だと思う >>454 ラムダからの類推で行くと、書けたとしても []Foo::Foo() : a(0) {} となるだけでは? まあそこまで行くと[]つける意味は皆無に等しいけど
467 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:21:57 ] >>463 と、変換関数な []operator int() -> intって書かせることになるのかなぁ
468 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:25:23 ] どういう使われ方想定してるのかな 今まで通り普通は旧形式で書いて、戻り値で型推論したいときだけ特別に使う物なのか それとも旧形式をobsoleteとして新しいプログラムは全部新形式で書かせることを狙ってるのか 後者だとしたら書けない関数があるのはまずい
469 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 17:56:04 ] >>465 このC++はバージョンアップするたびに規格書の厚みがはるかに増す…