C++0xはこのスレで最後になって次はC++1xかな 201x中に出せるかどうかは怪しいけど
C++0B
>>1 乙
最後なので事情通の人、C++学園のまとめを書いていただけたら
・progress_displayたん
C99未対応 == C++0x未対応?
c++0xはc99のVLA(可変長配列)サポートしないんじゃなかったっけ
他にも色々サポートしないよ コンパウンドリテラルとかコンストラクタあったら要らないし
禿はvector使えっていってる
T foo(int size, U array[size])とか狂ってるしな。やりすぎ
禿は自分の好き嫌いで足引っ張んなよクソが
vectorでいいじゃん
0xでもstringのデータは&s[0]で取得するの? dataだとconst付きのchar*が返っちゃうし
vectorじゃメモリー確保が遅すぎて代替品にならんだろ。 てか、禿はほぼ100% C99と互換性もたせるんじゃなかったのかよ。
18 :
デフォルトの名無しさん :2011/07/23(土) 00:13:43.64
だからやってるだろ
Designated Initializerは入れて欲しいんだが。 つかなんでみんなこれ無視すんだ。
VLAをvectorに替えて遅くなるというシチュエーションが思いつかん。
VLAの実装がallocaの場合はvectorより速い?
そりゃVectorといかnewはファーストフィットかベストフィットかしらんけど メモリ中を捜査して空き容量捜し回ってんだから1回の加算だけでメモリ確保する alloca方式には敵わんわなぁ。
template<typename T>struct vArray{size_t const sz;T*const p;T&operator[](size_t const a){return *(p+a);}varray(size_t const a,T*const b):sz(a),p(b){}} #define MKVARRAY(a,b,c,d) c*const b=alloca(sizeof(c)*d);vArray<c>a(d,b); MKVARRAY(varray,ptmp,char,size); varray[0]=""; インラインを展開期待のallocaバージョン書いてみた
適当にぐぐってみたら Danny さんて人がこんなこと書いますた > C++ programmers use arrays less than C programmers do. Instead, vectors, std::tr1:array, std::string and smart pointer classes are used. Furthermore, supporting VLAs would entail the changing of sizeof’s semantics, just as in C99. This is against the design philosophy of C++ which forced the separation between operator dynamic_cast and the remaining compile-time typecast operators. However, VLAs are still a problem if you try to compile a C source file using a C++ compiler. sizeofのセマンティクスに変更を強いる(sizeofがコンパイル時に確定できない)から駄目ってことですかね?
動的に決まるsizeofとか死ねばいいのにと思う
つかやったことないけどVLAのsizeofって動的に結果返ってくるの? だとしてC++で問題あるの?
sizeof適用不可にすれば?
> つかやったことないけどVLAのsizeofって動的に結果返ってくるの? うん
allocaする配列クラスを作れば良かったのに 実装方法? コンパイラが頑張れ
スタック使用を管理するクラスってどんなだよw
どっかにムーブされる可能性がある場合はヒープにとって、 関数内で利用が完結している場合はallocaして グローバル変数の時は静的に確保する万能クラスを! ……どーかんがえても組み込みの配列拡張したほうが早い→そしてVLAへ……
ムーブでそこまで特殊な事する必要ないだろー ローカル変数のアドレスの扱いは自己責任が基本
あと、静的に確保する際はサイズが決まって無いと無理なので arrayで十分
allocaが使用されるのは限定的な場面だしなあ sizeofは頻繁に出てくる分、動的sizeofになったときの影響のほうがでかいのだろうか… 一応TR2にdynarrayという動的配列のようなテンプレートクラスが提案されていたりする
お、提案はあるのか size()でサイズ取得するなら sizeofはクラス自体のサイズでいいからな
可変長配列は静的には無理だし、ヒープはnew[]そのものだし。 VLAくらいしかやることないだろ。
形式的に、sizeofの結果をポインタ+size_tのサイズとしてしまえばいい 配列の長さはsize()で取得 メモリ確保やメンバ関数の動作は組み込みで
あほか
dynamic_sizeof を導入すればいいじゃなーい。
ふつうにC++と共存してるコンパイラでできてることをなぜ変える必要があるのか
VLAだけじゃなくコンパウンドリテラルとかも導入しないと 共存なんて夢のまた夢だよ
void foo(int a[const restrict], int b[const restrict]); とかキモいし C99との共存とか要らない
正直C99をフル実装するという需要がどこにあるんだろうな
それを言い出すとC++0xをフル実装する需要は…という話にも
C++0xの需要ならここにある ……いやフルにあるかというと微妙かもしれないが
VLA自体はg++で実証済みだよね。 現実的に今さら問題になるような事は無いと思うけど。
ガスライティング
C++ユーザーが文法キモイとか
元がキモいからこそ これ以上きもい文法はなるべく要らないと ラムダくらいメリットが無い限り
すっかり手遅れな気がするのは俺だけか
互換性なんてもう諦めて新低級言語作れよ 過去の資産なんてコンバータ通せば十分だろ
碁
簡単に言うなよ。 C++からコンバート可能ということは、例え文法が違うとしても キモい部分含めてC++の全機能を持ってないといけないということだぞ。
僕の作った最強の言語はろくな結果にならない ソースはD言語
C++から学んだことは「コードは書いちゃいけない」
C++の文法って別にキモいとは思わないけどなぁ 1パスでコンパイルするためにめんどくさくなってる部分はあるけど それに、AppleのBlockの酷さを見たら、ラムダさんはもうあれでいいと思うよ
Blocksさんってそんなに糞なの? 前にラムダなんかやめてBlocksを標準にしろって林檎信者が暴れてたけど
文法で言えばRubyやVBの方がキモイと感じるけどな。 Rubyのブロックの改行がイラっとするし、メッセージやブロック関連が一貫されてないのが 意味が解からん。あとVBはなんで戻り値返すか、返さないかだけでサブルーチンの書き方変わるんだよ。 めんどくせぇだけじゃん。
Wirth先生大激怒w
__blockとかBlock_copyとか見た目のアレさ加減もさることながら仕様がクソすぎて胃の内容物がcore dumpする Blocksさん作った奴の言語設計センスはPHPの設計センスに匹敵するわ
>>61 RubyはEiffel系統だ。VBは色々混じってるがFortran系統だ。
endってキーワードが同じだけでPascal/Modula系統と一緒にするんじゃねえ。ぜんぜん違う。
つ procedure/function
Pascalは返値を捨てられないからな。 逆にModula以降は全部procedureだぜ。そんな事も知らないのはWirth先生に失礼だろ。
Block_release() で使う気なくなるなw C#でyield return見たときキモかったけど、理屈抜きで使えば便利だw
C++(のラムダ)にはデストラクタがあるってだけで、なんらかの後始末が必要なこと自体は変わらんと思うが
ラムダを返値として返す時に、 明示的にBlock_release()する必要があるか、スコープ抜けたら勝手に処理されるかは かなり決定的な違いだと思うんだが
つーてもC言語の文化を破壊してまで勝手に後始末される型を導入するなら クロージャ云々よりもそれこそまず動的配列だしなあw 暗黙に生成されるコードがほとんど無い利点を潰すほどじゃないでしょ
いや後始末っていうか、C++0xのラムダはコピコン(またはムーブ)で渡されるだけなんで スコープ抜けたらスタックから消えるってのは普通にC言語の文化を踏襲してるだけだから そもそもなんでBlock_releaseなんてものが必要な仕様にしたのかが分からん
? ブロックだってBlock_copyしなきゃreleaseもいらんのでは?
>>71 Blocksは変数キャプチャしたラムダを返値にする時はBlock_copyが必要
スタックからスタックにラムダをコピーできない
キャプチャするローカル変数の個数がわかんないんだから、固定サイズにはできないでしょ。 C++のようにラムダごとに別の型ってわけにもいかないし。
>>73 デストラクタ機構がないとスコープ脱出で自動処理とか出来ないもんなぁ
そもそもキャプチャ情報なんて動的オブジェクトになるんだから本質的にCと相性悪いので
Cに無理矢理ねじ込んだ時点でどう転んでもセンスの悪い設計にしかならない罠
道は無いこともないけどな。「可変サイズの返値」をサポートすれば。 要はallocaモドキの動作で無理やり呼び出し元のスタックに領域を作って返す、ってことだけど。 コンパイラに大改造が必要になる上に最近のCPUとも相性悪いけど。
>>75 そりゃ返値を返すだけなら方法はいくらでもあるが、
それを構造体メンバに代入したいとか言ったら結局詰むから何も解決してないよ。
いやさ
>>72 が「スタックからスタックに」って言ったから
親関数がスタック上にある場合のみ有効なdownward限定モードもあるといいなあとは思う。C++も含めて。
これなら関数ポインタとフレームポインタの組だけで済むしコピーとか後始末とか全く要らないんで非常に軽量。
初期のD言語のdelegateってことだけど。
>>77 C++的にはそれは「ムーブでやれ」じゃないかな
まあBlocksはCの範疇で使えないといけないから ああいうダサい感じになるのも仕方が無いよ デストラクタのあるC++とは違う
あんなダサい仕様にするくらいなら Boehm GCみたいなGC前提にしてくれた方が良いわ
詳しく知らないけどひょっとしてBlocksってObjCの仕様じゃなくてCの独自拡張なの?
そうか?むしろやってることがC++0xのラムダと変わんない分ありがたい気もするが。 下手にGC前提とかgccのようなスタックに実行属性付けるの前提とかやられたほうが C/C++両対応コンパイラにとっては痛すぎるぞ。
ObjCの独自仕様だが、Cに入れようとAppleが頑張ってる、って状況のはず
つまりC1Xに突っ込もうとしてるのか なるほど
正確には、C1Xに突っ込もうとしてた、かな? もうC1Xに入る可能性は殆ど無いと思う
ObjCの独自拡張じゃなくて、Cに対するAppleの独自拡張
てかあんなのがC1Xに入ったらC++系にC1Xは入れないでくれと言いたくなるぞ
>>82 Appleが出したBlocks提案にはGCの仕様も入ってるんだよ……(ゴクリ
あいつらに言語設計させないで欲しい
そこまで言うほどのことかよ。文法の違いだけじゃないか。 ABI的にはキャストすればそのまま渡せるぐらいだろ? それにGCつったってC++だってGCの想定はしてるじゃないか。
Block_copy/Block_releaseの存在が「文法の違い」で済むとは思えないが
文法の違いだよ。 Cにデストラクタやコピーコンストラクタなんて入れられるはずもないんだから。 あれか?C99の複素数もゴミと思ってるタイプ?
文法の違いって言ったらそりゃあ何だってそうだが、 C層への実装が適切かどうか設計時点で疑問を覚えるべき由々しき違いだと思うぞ。
それはC++側でやるからCは余計なことすんなって意味か? だとしたらすごい傲慢な意見と思うが。 CにはC++の事なんか気にする理由は全くない。 ブロックが没になるとしても純粋にC言語としてどうかって観点でのみ語られるべきで 上位言語でもっと上手い実装方法があるからなんてのは考慮されるべきではないだろ
C言語としてどうかって観点で言えばそもそもC言語には不適切な機能ってことになるだろうし どうせObj-C決め打ち環境での独自拡張なんだからObj-Cのメッセージ機構として実装すればよかったのにとは思うぞ
Cは高級アセンブラの立場を忘れるべきじゃないと思う。 64ビット幅の型とか、曖昧な部分の明確化とかのメンテナンス的な地味な改定だけでいいよ… 今更新しい機能を入れるとかやめてー
でも規格決めてる人達は未だに今をときめく高級言語だと思ってる節があるからなぁ… K&R時代の気分で
機械語レベルで考えて言語機能じゃないと実現不可能なものは入れるべき。 今のブロックやC++0xのラムダは所詮struct+関数ポインタのシンタックスシュガーだからどうでもいいけど gccのスタックを実行するタイプのラムダなら規格に欲しい。 あと可変長返値なんて欲しいと思わないか?strdupa(strdup+alloca)なんかをアセンブラじゃなくてCで書けるようになるぜ?
トランポリンはスタックまるごと実行可能にしてるんで勘弁
>C++0xのラムダは所詮struct+関数ポインタのシンタックスシュガー えー
ラムダ用のメモリが自動的に動的に管理されれば 単なるシンタックスシュガーではないのだろうけど、 0xのラムダは単にキャプチャ対象変数をメンバに持つ 関数オブジェクトを作ってるに過ぎない
ん、それで何か問題あるのかというか、それ以上何を管理して欲しいんだ?
>>99 だからメモリをだろ。
Lisp だと lambda 使いまくりだけど、 GC が無かったらかなり使い難い言語だっただろうなーとは思うので
>>98 に同意。
C++をなんだと思ってるんだ
>>99 管理して欲しいっていうか、管理していないからただのシンタックスシュガーだって
>>98 は書いてるだけだろ。
シンタックスシュガーが悪いってわけじゃないが、結局は何のシンタックスシュガーなのかをわかってないと
メモリ管理で躓くことになる。 lambda は C++ 的には無理のある構文だと思うんだよなー。
ごめん何言ってんのか全然わかんない なんでラムダがメモリの管理なんかしなきゃならないの?
>>103 >>73 std::functionだってメモリ管理はしてるだろ。
>>96 gccそのままじゃなくてもいくらでもやりようはある。
通常スタックから分離された実行可能属性付きのふたつめのスタックを用意するとか、
親関数の呼び出し時点でスタックフレーム自体をヒープに取ってしまうとか。
細部はどうでも良くて、コンパイラが直接サポートするならいくらでも効率の良い方法が
取り放題だし、そうでなくてはコンパイラが直接サポートする意味が無い。
>>103 ラムダの基底クラスとかあって、さらに動的に管理されていれば、
ラムダを返す関数を作って、
ラムダの基底クラスのポインタで受けれたりする
GCないから無理だろうけどねー
>>105 std::functionで受ければいいじゃん
意味わかんないんだけど シグネチャの異なるラムダを同じ変数に格納出来たら呼び出しが静的に解決できないから論外だし 同じシグネチャで異なるキャプチャのラムダは当然同じstd::functionで受け取れるようになってて つまるところ一種のスマポとして働いてるわけでメモリは管理されてるしむしろこれ以上何を管理して欲しいのか分からん おまいさんが言うところの「メモリ管理」ってのは何を指してるんだ
本当についてきてるか? GCなりスタックなりを上手く使えば「std::functionにローカル変数への参照をひとつひとつ持った関数オブジェクトを格納する」よりもっと効率のいいやり方があるって話だろ
GCがある時点で効率がどうたらとか…
もしかして > std::functionは「メンバ変数として」キャプチャ情報を持っていると思っている
効率上げるためにGCを導入とか意味不明なんですが
>>110 いやそれは流石に無理やり相手が勘違いしてることにしたいとしか思えん
GCは、もしGC環境下ならの仮定の話だろ
GCGC言ってる人は 参照キャプチャする場合の話をしてるのか、コピーキャプチャする場合の話をしてるのか そこからして最早分からなくなってきた。 俺は後者の話をしているものだとばかり思っていたのだが。
>>112 「ローカル変数への参照をひとつひとつ」とか言ってるのでそのレベルから勘違いしている可能性は高いと思うぞ
正解は「相手が2人いる」だから……。勝手に意見を含めて代弁したりした部分は混乱させたかな、すまん。 俺はどっちかと言えばスタック操作派のほう。
参照キャプチャする場合なら、 C++の関数オブジェクトはネストされたスタックポインタをメンバに記録しておけるからわざわざトランポリンとかする必要もない。 コピーキャプチャの場合なら、 どのみちコピーは必要なんだからメモリ確保してそこにコピーしてstd::function自体がスマポとして振る舞えばいい。 GCの出番は無いと思うんだが。
GCがあるならスタックフレーム自体をヒープに確保して放置でコピー一切不要とかもありだけどな一応
ラムダのコピーがちょこっとだけ早くなる代わりにそれ以外が悪夢のように遅くなるな
そこはそれ、関数内で使われてるラムダをどっかに持ちだそうとしてる状況でのみそうするとか、いくらかやりようが
1度でもGCを許すなら全てGCにしてしまった方がまし。 それが許されない状況があるからC++を使ってるわけなんだけど。
別の機能でも聞く話だな
>>120 そしてそう思わない人たちがObjective-C(++)を改築してる。
方向が違いすぎて相容れない。
Blocksは@Appleだけで幸せにやっていくと思われ
C++って何でシンボルを扱う機能が無いんだろうな。 時々無性に欲しくなる。 Holder<InterfaceA,MethodA> objectA; Holder<InterfaceB,MethodB> objectB; object.MethodA(); object.MethodB(); //MethodA,MethodBは引数で渡された名前が付いてるだけで同じ物。
objectってのは何クラスなの?
ごめん。objectAとobjectBね。 AとB書き忘れた。
何が呼び出されるの?
何を言いたいのかよく分からんな
こうしたいんじゃね? template<typename T, funcname F> struct Holder { void F(){} };
>>128 そんな感じ。要するにメンバー変数とかメンバー関数の名前をテンプレート引数で指定するって事。
そういうシグネチャの違いは、コンセプトマップで吸収される予定だった。
グルーコードとは違うことを言っていると思われる。 なんであるかはよく分からないが。 template<typename T, typename U, funcname F> U func { return T.F(); } こんな感じなのだろうか… staticに決まらなくていいならいろいろやり方あるのがC++だが。
>>128 それで嬉しくなる使い方ってのがいまいち想像できんなぁ
>>123 C++でも必要ならマクロを使ってもいいんだぞ。
#include <iostream>
#define CreateHolder(name, interface, method)\
class Holder##name {\
int method_impl() { return 1; }\
public:\
int method() { return method_impl(); }\
}
int main() {
CreateHolder( A, InterfaceA, MethodA );
HolderA objectA;
CreateHolder( B, InterfaceB, MethodB );
HolderB objectB;
std::cout << objectA.MethodA() << " " << objectB.MethodB() << std::endl;
return 0;
}
返り値の自動推定は導入されなかったの?
decltype??
ランバダ! ランバダ!
メンバ関数ポインタでいいんじゃないの?
何もかもマクロでOK
>>138 templateと組み合わせればいいよね。
俺もdecltypeがない時代にはよく作ってた。
本の虫の人のユーザー定義リテラル嫌いは異常
今回の策定には予約語の名前空間とかって全く出なかったの? 予約語は広域名前空間の所属って事にしとけば、コンテキスト依存とか 作らずに済んで今後のキーワード追加が楽になっただろうに。
それはそれでただでさえ死んでるlexerがハーデスに魂を売って攻めてくる勢いになるぞ……
>>143 そのやり方だと、広域でない名前空間に予約語を名前として登録できてしまうが?
名前空間ごとに予約語の意味が変わるとか素敵やん
Lisp 系言語だとそういうの有るよな。
>>145 使いもしないexportとかに延々と予約語として居座られてるよりましだろ。
import(),export()メンバーとか素敵やん。
使われてない予約語があるより、 名前の意味が変わってしまうほうがましか… さすが思い付き君w
auto「・・・」
予約語namespaceを上書きして詰む言語とか面白いな
Forthの仲間入りできるなんて素敵やん
なんで本の虫なんていう名前にしたのだろうね。 自分は本を沢山読むことを誇りにしているからなのかもね。
じゃあ俺はエロ本の虫にするわ
g++ にc++0x拡張オプションで使えるのって autoぐらい?
decltype復活してほしいなあ
boost::shared_ptrは出来損ない stdに入れた意味が分からない
どうせならintrusive_ptrが欲しかったなぁと思ったらtr2には入るんだっけ? shared_ptr使うくらいなら作るよね
shared_ptrは機能と性能で丁度いいところ。出来損ないなんかなじゃない。
動的削除とスレッド対応は機能を分離するべきだった 要らんときにまで無駄なコストが掛かる
それは実装の問題であってshared_ptrの仕様の問題じゃない。
仕様の問題だろ
boostのはコンパイル時のコンフィグでスレッド対応無効に出来る。
標準ライブラリとしての shared_ptr は可用性を優先したということなんじゃないかな コンパイラがその使用を強制する訳ではないし 必要で可能ならBoehm GCとかを使う自由は常に残されてる訳で
intrusive_ptr をキーワード消費してでも言語レベルで実装すれば全て解決 shared_ptr はライブラリでOK
intrusive_ptrはintrusiveっていう乱暴な形容詞のせいで損してると思う
確かにintrusive_ptrは言語レベルで有って良い機能だよな
そうかそうか
ねーよ
>>170 ライブラリのままでもいいような……
いまのライブラリ形式と比べてなにかいいことあるか?
>>173 コンパイラでインライン展開された時に最適化できる余地が増えるかも
あほらし
vtbl埋め込めるなら参照カウンタだって埋め込めるはず
え?参照カウンタ内蔵??ユーザーオブジェクトがカウンタ持ってるのを融通するポインタじゃないの?
どこで死ぬか判らんのにポインタに埋めてどーすんだよ それならshared_ptrで十分じゃん
constみたいな記述でいいよね 実体や生ポでこさえたオブジェクトにはカウンタ付けない、カウンタは見えない触れない、生ポ→intrusiveは不可、循環参照は「知らんshared_ptr使え」で A*intrusive a;
shared_ptrも循環参照は・・・
weak_ptr使えだな
何がやりたいのかなんとなくわかった intrusive をつけると自動的に参照カウンタを添加してくれる機能か それってshared_ptrなんじゃ……
shared_ptrは非効率的に自動的にカウンタを付加してくれる機能 組み込みは効率的に以下同文ってことを言いたいんだろう
make_shared で解決?
機能選べればもっとマシになるんだがなぁ
選択的にオンオフが出来て、コンパイラがそれを有効活用出来ればいいけど。
>>185 選べたとして、削りたい機能って何?何のため?
メジャーな部分だと動的デリータとかマルチタスク対応だな 使ってない時でもコスト払うのはばからしい
>>187 >>185 じゃないけどマルチスレッドとデリータだろうな
影響の大きさはともかく、
前者はカウンタの増減の実行速度に
後者はshared_ptrのサイズに影響する
これらをポリシー化すればもうちょいマシになると思うんだけどどうだろう
カウンタとデリータの確保は確かプ−ルから取ってるからこれ以上効率化するのは難しいだろうし
ばかばっか
>>188 ソース中で使わなきゃ無駄に動かないだろ。
例外と同じ。
デリータはポインタ所有権持った瞬間に生成されるから使わないとか無理 コピーやら代入やらもマルチタスク対応してんのにコレ使わなかったら共有ポインタの意義ゼロじゃねーか なんか書き込みたい時はちゃんと少しは考えてからにしてくれ
どうやったら使わずに済むだろうかと悩んでしまったw
intrusive_ptrが言語レベルで実装されればscoped_ptrやauto_ptrもお役御免に出来るな auto_ptrの破壊コピも解消されて可用範囲広がるし
普通のポインタとどう共存するつもりかい
ポインタ演算実行時に型情報を確認する行程を挟む負担くらいだと思うよ 条件の無い代入やconstポインタ等コンパイル時で有る程度決定できるだろうし
パフォーマンス重視するならちゃんと設計して生ポかユニポで話はおしまいなんですけどね パフォーマンスを気にしてもしゃーないところを適当に済ませる分にはシェアポは優秀
普通のポインタに代入した場合とか
マーク&スイープ方式のGCライブラリないの?
boost::noncopyable が継承するとコピーできなくなるように、 継承すると一時オブジェクトのみ作れなくなるようなクラスって作れませんか?
コンストラクタをプライベートとかにしてstaticメソッドでnewして ポインタ返すようにすれば0x関係ないな
一時オブジェクトは作れないけどスタックには置きたいとか? ならどうやっても無理
ですよねー。
ありがとうございました。(間違って途中で送ってしまいました)
久々にmailing来てるな ちょっとだけだけど
>>206 Sun ONE StdioのClamageさん、Oracleに留まっているのか。
最適化関連で新規導入されたのはないの?
constexprとか?
こういう質問ってどこまでを現行と認識してるのかがわからんww
03だろ常識的に
>>176 カウンタはvtblじゃなくてヒープのメモリ管理領域を拡張するかなんかして埋め込む形になると思うわ
「生ポの代入を認めず」になれば判別はコンパイルタイムに行えるから
一般的じゃないメモリモデルマシンの場合はどうなるか知らんけど
>>212 > 「生ポの代入を認めず」になれば判別はコンパイルタイムに行えるから
研究レベルでも行える時がたまにあるレベルです。
Automatic Reference Counting
llvm になかなか欲しい機能がとりこまれない lambdaとか llvmって素人がコードの投稿できるものなの?
俺の欲しい機能がないからという理由で、lambdaをちょちょいと実装してパッチ送る「素人」か。
llvm/clangコードリーディングやりたいな
llvmにlambdaはいらんだろ。 Clangの間違いか? とりあえず開発者メーリングリスト読めよ。
ClangにはBlocksが入るんだからそれを使えばいい
お断りします
>>220 いやむしろBlocksがそれじゃねという……
bitcodeレベルでラムダを表現するなにかが欲しいということだろう。 最適化が期待できるし、カスタムフェーズ挟んで関数型言語のコンパイラみたく スタックをヒープに取るような荒業もいれられるかもしれない。 まあスレチ。
C++にもproperty ほしいな
vcのアレみたいなのか?
委員会はpropertyいらないって方向みたいだけどやっぱり欲しいよね。 自分で実装するとどうしたってthisへの(無駄な)ポインタを持たせないといけないし。
thisポインタ・・・?
そうですね テンプレートではノーコストでプロパティを実現することは難しいような気がします できれば規格でサポートしてもらえると嬉しいのですが…
プロパティでセッタをパブリック未満にしたいことはよくあるな。
ノーマルな関数形式はそろそろ何とかならんのかね。シンタックスシュガーでいいから。
>>228 バインド系ってこう書くのか。へぇー。
Borland C++Builderなんかではpropertyがうまく機能していたように思うんだけど、 どこも真似してないよね。なんでだろう?
getとsetだけだと+=とかできないから
両方使えば済むんじゃ
Obj-C 2.0
>>233 intとかならそれでいいけど、ユーザー定義のoperator +=があるクラスはどうする?
T tmp = get(); set( tmp += x ); はどうかな
どこまで最適化されるかだが・・・
#define PROP_INIT(type, name) name(this, &type::get_##name, &type::set_##name) みたいなマクロが欲しくなるな
C++0xの機能で何かプロパティ作成に役立ちそうなものはないものか
>>240 演算子オーバーロードは全列挙したらいけそうだね。
一般メンバ関数は方法ないかな?
getterでポインタは無いなあ。自分の持ってないor一時的なオブジェクトをさも持っているように見せかけるための プロパティなんだから、ポインタ返せるならそれこそ参照でもメンバに持ってればいいし。 ->は、C++のセマンティクスとして微妙じゃね? shared_ptrはポインタを踏襲しているから->だけど、プロパティはメンバ変数もどきだから.じゃないと整合性が
>>245 プロパティを狭く捉え過ぎでは? > さも持っているかのように
>>246 ↓とかやりたいじゃん。
struct rect {
int left, top, right, bottom;
__property int width { read = get_width };
private:
int get_width(){ return right - left; }
}
つ 狭く
こういうプロパティでも凄く有用なんだけどな private: int _left; public: __property int left { get(){return _left;} set(int n){_left=n;} };
この方がC++0xっぽくていいかな。 struct A { int get() const; void set(int); property int read_write(&A::get, &A::set); property int readonly = &A::get; property int writeonly(0, &A::set); property int dynamic; A(): dynamic(&A::get) {} };
既存のコンパイラ拡張の__propertyにラムダ突っ込んで叱られるフラグ
private: int _value; public: PropertyMacro(int, Value) { int get() const { return self->_value; } void set(int value) { self->_value = value; } }; C++03でこんな感じに書けるようにしたことあったけど、作るだけ作って結局使ってないな thisポインタ持たなくてもいいようになればなぁ
property だから括弧要らないとか考えるのめんどくさくないか?
データメンバーだから括弧要らないとか考えるのと一緒じゃないですか
プロパティ欲しいとか言ってるヤツの要求はこんなもんで満たせるんじゃね? 単純にするために漏れ漏れpublic制約があるけど #define CLOSE_GSTTER }; #define GSETTER(a,b)struct a{b a##_value;operator const b&()const{return a##_value;}const b&operator=(const b&x){return a##_value=x;} }; #define GSETTERFACTS(a,b)struct a{b a##_value;operator const b&()const{return a##_value;} #define GSETTERFACTGS(a,b)struct a{b a##_value; struct A{ GSTTER(MYINT,int) GETTERFACTS(MYINT2,int)   int operator=(const int x){return MYINT2_value=x/2;} CLOSE_GSTTER };
もうちょっと整理してくれ
class nantoka { struct { int value; operator... } puropati; の形は struct 内部で変数を宣言しなければならないのと 内部で宣言した変数にしかアクセスできない制限がありまする
C++0xが満場一致で国際標準として承認されました。
そうかそうか そうか……
bravo!
>>255 データーメンバーはprivateだから考えるまでもないし。
>>259 C++11となったようだがC++0xの「0」とは何だったのか
いまさらC++11って名称が普及するかなぁ。
ITTFのことだ。C++12になっても驚かない。
266 :
デフォルトの名無しさん :2011/08/13(土) 20:27:37.37
>>259 ttp://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/ The final ISO ballot on C++0x closed on Wednesday, and we just received the results: Unanimous approval.
The next revision of C++ that we’ve been calling “C++0x” is now an International Standard!
Geneva will take several months to publish it, but we hope it will be published well within the year,
and then we’ll be able to call it “C++11.”
I want to extend my thanks again to Bjarne Stroustrup for sharing his work with the world
and continuing to help move it forward,
and to all of the participants whose hard work went into achieving this important milestone in the history of a great language.
Thanks!
>>263 0bないし0cの0と、全会で一致しております。
ようやく決まったか! 今FDIS読んでるといくつが誤植あるけど、直されてんのかね 113p2行目 ) が足りない 201p sometype と some_type が混在 あとどうでもいいけど、180pの [[ no return ]] はスペース空けてんのに [[carries_dependency]] は空けてないのが気になる 71pの3行目も気になるんだけど、これは何が言いたいのだろうか? pb の指す先に関わらず、&pb は OK だと思うんだけど
ユーザー定義リテラルさん大勝利wwwwww
勝手に改名させられたあげく、退学処分になりました。
学園の人々 決定ver. を書いてくれ
VCにイニシャライザリストさんがくるのかな。かなり楽しみ。
template alias があれば typename myalloc_vector<int>::type とタイプせずにすむ…><
>>268 原則としてFDISは修正不可、賛否表明のみだから多分残る。
さあ今すぐDefect Reportを!
次はC++2xになるのか?
禿はC++16くらいにしたいと言っていた ということは実際はC++20あたりだな
最後は60.60ですな。
tr2ってどうなったの?
gccの<regex>サポートはまだ時間かかるのかなあ。
ビョーン! スポッ! スポッ!!
>>282 それ、C#の名前の由来で見掛けたようなw
当面の課題はTR2とコンセプトか
いや、C++98と同じく、一年ぐらいはおとなしくなるだろうと思う。
コンセプトを復活させて、range-based for文のADLを、さっさと投げ捨ててほしい
そういやコンセプトさんは、何が難しかったんだ?
ググれよ。 ともかく簡単に説明すると、 「空のconcept mapに意味はあるのか。concept mapは常に自動で生成されるべきだ」 という主張と 「いや、conceptは常に明示的であるべきだ。たとえシグネチャが同じでも、意味まで同じとは限らない。明示的に書かせるべきだ」 という主張がぶつかり合って、収集がつかなくなった。
>>288 なるほど。ありがと。とりあえず明示的にして、あとで省略できるようにすればよかったのにね。
conceptさんは一から設計し直しだな
うむ。 事前の外部conceptsでなくテンプレート内で定義の必要を明示する方が良いわ template<typename T>struct A{ bool operator(T a,T b){return CONCEPT<a,b>(a>b);} };
それだと、sort(Container& c, Comparator cmp) と sort(Iter b, Iter e) の区別がシグネチャからは付けられなくない?
意味わかんない
yappaわからんわ 特殊化するだけじゃないの? template<typename T,typename U>void sort(T a,U b){〜x=CONCEPT<a>(a.ite++);if(CONCEPT<a,b>(b.cmp(x,a.ite)))swap(〜} template<typename T>void sort(T a,T b){〜x=CONCEPT<a>(a++);if(CONCEPT<a>(x<a))swap(〜}
>>291 だと、単に
T型のオブジェクト通しに適用できるoperator <があり、さらにその戻り値がboolに変換可能か?
ぐらいしか判定できない。
しかしそれは、すでに現行のテンプレートで行っているじゃないか。
そういうことができなければ、正しくコンパイルエラーになる。
それは単なるシグネチの一致であって、そのoperator <が、実際には何を意味するのか保証できない。
コンセプトというのは、単なるシグネチャの一致ではなく、
たとえば、LessThanComparableとかの具体的な「意味」を表す名前をつけて、
たとえ同じoperator <であっても、単なるシグネチャの一致とは区別化できるところにあるんだよ。
297 :
デフォルトの名無しさん :2011/08/16(火) 23:47:26.44
禿が言ってるのは、現状のコンパイルエラーに対する不満だよな エラーメッセージをわかりやすくするシンタックスシュガーが必要であると 俺的に通訳すると継承を使わないインターフェイスが必要だったな、てなとこ 意味的に operator < と operator >= の対称性が保たれているかどうかなんて 「テスト工程すべて」をコンパイラの機能だなんて幻想は考えてないだろ
まあaxiomは要らないと思う あんなんコメントでいい
しかし、axiomの存在は理解できなかったな。 たとえばoperator <が大小比較を意味して、a < b かつ b < c ならば a < cであるとか、 その他様々の保証としてのaxiomを書いたとしても、 それを検証してくれるようなツールは、まず近い将来に登場しないと思うんだよ。 禿は、ソースコード中に仕様書を書くための機能だって言ってるけど、 提案されていたaxiomの極端に制限された文法で書くよりは 自然言語による表現力の高い文法で書いたほうがいいにきまってるだろ。
どうせ解析に使われないんなら doxygen使えば良いじゃない、という感じ
ついに決まったのか
長い時を経て正式に決まった割に盛り上がってないな C++最大の革新でしょ? この温度は何?
C++はオワコンだから
もう随分前から決まったも同然だったし、 99.9%準拠のコンパイラが出るまでは特に今何か語ることもない
ここにいる人ならC++ 0x解説サイトとか作れるでしょ そこでアフィってぼろ儲けしようという人はいないの
ぼろ儲けするほど人が来るわけない
現在と将来のC++ユーザーのほぼ全員が悶え苦しんでネットの情報にすがるわけだから すごい数になるでしょ
つC99
別にフル機能使う人なんてまずいないし、そういう人は勝手に勉強する 企業では技術力低い人に合わせてコーディングルール作るから、知らなくても 問題ない
英語で書けば少しは儲かる可能性あるけどね。日本語じゃあ。
英語ならそういうサイト腐るほどあるだろ
C++使ってる日本人の大半の現状を見るかぎり解説とか、なぁ
初心者向けならC99のcompound literalを布教してくれたほうが嬉しいなあ C++0xはソースは簡潔になるけど、人の書いたコードを読む時0xのほうが嬉しいってのがあまり思いつかない せいぜい=defaultぐらい?
C++11でユーザが悶え苦しむような部分ってラムダちゃんの使い方くらいじゃね ディープなライブラリ作成者を除けばほとんどが「何も考えなくても恩恵受けられる機能」ばかりだよ
lambda式のどこが難しいんだよ。 多分一番難しいのはムーブだろ。
いやいや読みやすさだよ。 ラムダはむしろ読みやすい方。 今までは初期化式の{}を見たらコンストラクタは呼ばれないと切って捨てれたのに、そっちも探さないといけなくなったし range-based forだって深追いしようと思えば実際呼ばれてるbeginとend探しまわるハメになると思う
ムーブってそんなに難しいか?
難しいんで字句以外にも何度も修正されてます。
ムーブどころかコピーすら難しすぎて理解出来ないようなのが大勢プログラマー名乗ってるからなぁ
ムーブは最後の最後の土壇場になって、言語仕様に取り入れられた。 それまでは、単にrvalueリファレンスを用いるライブラリ側の取り決めでしかなかった。 でもそれじゃまずいってことで、コピーと同じく、コア言語側でも規定されるようになったんだよ。
そのぐらい知ってるわよ ばかにしないでくれる
hidingさんの文体が本の虫っぽいけど本人ですか?
盲蛇に怖じず
324 :
デフォルトの名無しさん :2011/08/17(水) 17:14:21.39
>>309 > 技術力低い人に合わせて
これだけは避けたかった受け入れがたい事態だな
丁稚や女中が組織全体の律速段階でいいんだと開き直ったら何ができるんだ
>>319 やめれ、耳が腐る
じゃああんたが教育すればいいんじゃね
C++は教育コストが高すぎる
ムーブは使う側が意識する必要はあまりないような
328 :
デフォルトの名無しさん :2011/08/17(水) 18:30:10.43
>>326 逆だろ、今までのプログラム言語が歴史の浅い原始的で学問未満なものだった
世のため人のために役立つ知見とは元々そんなに甘くないというだけ
C++を教育するコストで CとCommon LispとSmalltalkとHaskellを教育できる
そもそも平均以下のプログラマには何の関係ないスレだし。 通ったばかり規格のスレだから。教育とか他所行け。ドアホ。
え?いまどきC++に無様にしがみついてるプログラマが平均以下じゃない……?
332 :
デフォルトの名無しさん :2011/08/17(水) 18:45:14.03
同感だな 自分は平均以下でないと行間で言ってるのがすげー滑稽
お前一人でどれだけのコードがかけるんだって話。 教育コストは生産性の大きなポイント。
334 :
デフォルトの名無しさん :2011/08/17(水) 20:14:43.61
違うね 大きなポイントはコストではなく効果だ 最大のポイントはそいつの生涯の稼ぎで 次いで教育コストとの比 それから負担割合 不戦敗する奴に金かけるのは確かに無駄だ
templateでlispインタプリタ作れるまでC++を熟知するより、3Dのレンダリングエンジンを フルスクラッチで開発できるようになる方が時間がかかると思うが。
あほか
まあ言語の勉強をするぐらいならアルゴリズムの勉強をしたほうがいいってのは正しいからなあ
axiomうんぬんは永遠に先延ばしするとして static_assert系の仕組みの引数にprintfのformatみたいな方式でoperator有無のチェックを記述出来る様にしたらどうかな static_assert(A,"++\(int)++\*()\*(A)","unimplemented");
モノつくれよw
>>338 そんなのやだ
演算子の有無はconceptでチェックしたい
>>338 これじゃあかんの
sizeof((A()+1,A()-1,A()*1,A()/1))
343 :
デフォルトの名無しさん :2011/08/17(水) 22:29:13.34
同じフレーズを何度も書き直すのすげーいや
>>342 インクリ/デクリメントのチェックに副作用が
なんだかんだ言ってもWebKitとかChromeとかv8とか、 低レベルシステムソフトウェアはC++が全盛です。 底辺プログラマには縁のない世界。
346 :
デフォルトの名無しさん :2011/08/18(木) 00:56:47.19
低レベルと底辺をうまくかけたなw
そりゃてーへんだ
大変と底辺をうまくかけたなw
>>343 decltype使った末尾戻り値型もそんな感じだな
lambdaみたいに戻り値の型をreturnに書いたやつから類推して欲しかった
>>349 returnから型推定すごい欲しいなあ
OCamel使えば自動型推定はやってくれるけど
関数の定義見るまで返却値型がわからないんじゃ前方宣言もあいまいになるし そうなると宣言だけあれば関数を呼び出せるのができなくなるだろ
includeに代わる何かをどうにかしようって話とも関係してくるようなそうでもないような
結局プロトタイプでは型推論しようがないからなぁ
型推論はなんで必要なの? 書くのが面倒ならマクロ使えばいいじゃない。
オレオレマクロは再解釈するのが面倒だから廃してほしい。
定義の場合のみ類推可能にすればいいんじゃないの? template <typename A, typename B> auto add(A a, B b) -> decltype(a+b) { return a+b; } を template <typename A, typename B> auto add(A a, B b) { return a+b; } にできるだけでも価値はあると思うけど まあ、構文解析難しいとか他に何か問題があれば別だが
template <typename A, typename B> auto add(A a, B b) { if(pred)return a+b;else return NULL; } とかどうする気なの
次のスレタイどうなるの C++11 14?
それは規格書が出版されてからでいいんでない? 出版が来年にずれ込んだら C++12 になるのだし
C++0xで定着しちゃったからなぁ・・・
>>357 template <typename T> void f(T a, T b);
f(a+b, NULL);
のTと同じ型が類推される、と定義すればいい。
型が合わなければエラー。
>>356 template <typename A, typename B> auto add(A a, B b) { return decltype(a+b); }
って書ければいいんじゃない?
returnが複数あればそれぞれdecltypeって書く。
template <typename A, typename B> auto add(A a, B b) { if(pred)return decltype(a+b);else return decltype(NULL); }
複数にdecltypeに矛盾がなければ戻り値の型が決まり、矛盾があればエラー、とか。
戻り値型の類推自体は既にlambdaがやってんだし、何も特殊な事ではない 定義がないと使えないというのはあるけど、別にそこは重要ではないと思う。 なぜなら、ほとんどの場合テンプレートでしか必要ないから。 (テンプレートじゃなくても、一応inlineや内部リンケージでも可能だが) プロトタイプも、定義が出てこないと使えないものの、書く事自体は出来てもいい。 例えば template <typename A, typename B> struct BinaryOperation { auto add(A a, B b); }; template <typename A, typename B> auto BinaryOperation<A, B>::add(A a, B b) { return a+b; } とか。
365 :
デフォルトの名無しさん :2011/08/19(金) 18:53:11.11
プロトタイプ宣言の話と似てくるが再帰呼び出しが(も)できない
C++1xだと次の仮称になる可能性があって紛らわしい
次は素直にC++xxにするんじゃない? その次はしらんけど。
シムシティ路線でC++3000
次期concept早く来ないかな。 concept = constraint + axiom って感じらしいが。
axiomはイラネ
個人的に理解不能なものを拒絶してしまうのはよくあること
axiomの存在価値を理解できるか? 英語でいいからコメント書いてくれてる方が分かりやすい
ペーパーで解説無かった?
concept さんが在学していたころのドラフトを持ってないからよくわからないんだけど axiom って最適化に使ってもいいみたいだし それなら意味があるのでは? 「axiom に違反するときはコンパイルエラー」とか「例外をなげる」とか 変なことを言い出したら、 exception specification の二の舞になる気もするけど 「axiom に従って勝手に最適化しますよ。 あなたのクラスが axiom に違反してても気にしませんよ」 という感じでやってくれるなら歓迎。
最適化ならpragmaでいいじゃん。
378 :
376 :2011/08/21(日) 13:48:22.98
N2887 を読んだら、いきなり動機で 「axiom は、最適化に役立てることは動機ではない」といきなり否定されてるな…。 なら確かにゴミだな。
親クラスから、孫クラスへ子クラスでコンストラクターを作らず、 コンストラクターを呼び出させる事ってC++0xじゃないと無理なんかね?
struct Base{ Base(){} }; struct Derived{ Derived()=delete; }; struct Grandderived{ Grandderived(): Base::Base(){} }; こういうこと? 0xでも無理だろ
0xなら子のコンストラクターを一切書かないことを条件に、 親クラスのコンストラクターを子に引き継がせることができる。
>>381 継承コンストラクターは、コンストラクターが無いわけじゃない。
継承コンストラクターは、基本クラスのコンストラクターと同じシグネチャで、
実引数をそのまま渡すコンストラクターを、自動的に宣言するだけだぞ。
「コンストラクターを作らず」といったら、
>>380 だ。
c++0xは完全にマスターした 早くc++1x来い
>>382 理屈がどうであれ実質変わらんがな。
暗黙で作られるつったってコンパイラはどうせvtableだけ置き換えて
親クラスのコンストラクターそのまま使うんだから。
>>382 がもし理屈上だけでなく明確な実装まで影響する話だとしたら、
0xの継承コンストラクターって、オブジェクトの値渡しをしたら
子のコンストラクターで1回、親のコンストラクターで2回目の
コピーないしムーブコンストラクターが呼ばれるのか?
axiomはスキーマです。
スキマです。。。 隙間です。。。 ヒロシです。。。
>>384 12.9 の第8段落
暗黙に定義される inheriting constructor の例:
ThisClass(T t): BaseClass(static_cast<T&&>(t)) {}
ここでわざわざT&& にキャストしているのは、
親クラスのコンストラクタで T が && のときに対処するため。
で、わざわざそんな配慮をもって記述されているということは
T が値渡しならもちろん二回コピーされるってこと。
>>387 例と書いてあるけどそれは一例じゃなく実装義務なのか?
RVOのように省いちゃいかんのか?
>>388 自分で FIDS 読みなよ……と思ったけどもう非公開になってるんだったね。
省略していいなんて書いてないよ。
Inheriting constructor の概略はこう。
12.9-1. using-declaration でコンストラクタを指名すると、
inheriting constructor を暗黙に宣言したことになる。
3. 暗黙に宣言された inheriting constructor は、
ベースクラスと同じ引数リスト(など)をもつ。
8. inheriting constructor は、odr-used されたときに暗黙に定義される。
暗黙に定義されたコンストラクタは、
>>387 のようなユーザー定義の
コンストラクタと同様の動作をする。
>>384 実装の話がしたいならスレ違いだ。
「この関数呼び出しは実装ではインライン展開されるから、規格上でも関数呼び出しなんて発生しない( ー`дー´)キリッ」
もうOCamelのsubsetまるまる持ってきちゃえばいいのに 進化の方向同じなんだから そうすればOCamelのライブラリも使いまわせて最高
肝心の言語の名前を間違えるくらいの認識で 進化の方向が同じなんて判断がよくできるね。
>>390 規格が許すか許さないかの話なんだからべつにいいんじゃね。
実装を見据えなかったexportがどうなったかを考えると 実装に言及するのも必要だと思う
OCamlのことなんかなあ。 同じ方向に見えるなら全然勉強足りないから初心者スレで修行を。
ガーベジコレクタのないOCaml = C++
名前解決に対する考え方すら全く違う。
17.6.3.5 Allocator requirements と 20.6.8 Allocator traits に、typedef ●●& (const_)reference; が欠けてるのはどうして? 20.12.1 scoped_allocator にもない。 20.6.9 default allocator だけは持ってるけど、これは互換性のためだろうか。
>>399 トン
「pointer とか reference とかの typedef を要求してたけど
それが必ず value_type*, value_type& でなければならないなら
意味ないじゃん、カスタマイズする人に面倒かけるだけで」
という状態だったところ、改変によって
- pointer はスマートポインタでもなんでもいいように生まれ変わった。
- reference は更生できず退学になった
というわけね。
いきてる?
スマートポインタでも何でも良くなったのであれば ますますreference必要じゃね?
C++ではスマートポインタは作れるけどスマートリファレンスは作れないんだよ
weak_refer<T>が必要になる様なうっかり遣ってしまいそうな事てどんなコード? 子スレッドから孫スレッド作って子スレッド消滅くらいしか思いつかんわ
>>402 pointer側は関係ないんだよ
referenceがvalue_type&しかないのが問題
そっか そりゃそうだな まあreferenceなんざ、value_type&のみでいいんじゃね?
407 :
デフォルトの名無しさん :2011/08/27(土) 09:06:13.47
>>406 昔のx86みたいに、farポインタnearポインタの区別のある世界なら、
referenceにもfarとnearの区別が欲しくなるのではないかと思う。
そんなところにC++11がやってくるかどうかは別として。
far/near の違いは pointer のほうに持たせるのが自然じゃないの? allocator の話だろ? allocator はたとえば vector<T, allocator<T>>::push_back(val) の val を far の参照で受けるべきか near かなんて責任を負わないと思うよ。
C++相談室を見てて思ったんだけど、イテレータコンセプトってどうして流れたの? そのまま Boost のイテレータコンセプトを採用するって聞いたけど。。 経緯を知っている方、もしいれば教えて下さい
llvm clangは早く全部の機能を実装してくれ iphone開発で使いたいんじゃ
<iterator_concepts>はあったけどコンセプト削除とともに消えた
iphoneならBlocksさんが全部何とかしてくれるよ
>>411 さんの要望はIndiana版conceptの彼が叶えてくれるだろう。
>>411 03の機能は完全なんだからいいだろ。
11での開発を今から始めるのはバカすぎる。
あと4年は待て。
せめてlambdaだけでも実装されないものかのお
されてもどうせ規格非準拠だぞ。 3,4年たったら規格準拠になって今書いたコードが 腐るかもしれん。
Blocksが普及するまで政治的都合でlambdaは実装されないテロ
3・4年も価値のあるコードなんてかけないだろw
他の言語ならともかくC++だったらあるだろ。 うちの会社のライブラリなんて未だVC6.0で書かれたものが生き残ってんだぞ。
簡単に書き直せるだろ
どうやって?
どうせ書き直すならboost.lambdaでも使ってたほうがマシ
>>421 そもそも、VCの処理系依存は、スコープすら違うんだぞ。
しかもそれが、50万行以上。
つかC++でラムダとか頭悪いだろ
ラムダさん超便利なのに。。。
てかCでラムダよりはまだよほどまし
>>418 あの人たちはCLang行ってしまったから、
g++は影響受けないと思われます。
429 :
デフォルトの名無しさん :2011/09/02(金) 18:24:42.24
>>425 ラムダまでいかないにしても、関数内関数が使えるとすごい嬉しいな
というか関数内ではret foo(args){body}を auto foo=[&](args)->ret{body};と見做すようにすればいいだけなのになんで0xでも関数内関数出来ないの?
>>430 関数内でラムダ宣言してautoでキャプチャすればことたりるからじゃね?
これでなんか不満あるの?環境はVC10EESP1 #include <iostream> int F(int v){ auto F2 = [](int va){ return va+1;}; return F2(v); } int main(){ int N = F(100); std::cout<<N<<std::endl; return 0; }
ラムダの括弧がださいって話だろ
リンゴよりマシだろ
見た目が問題なのはautoでない時の返値だろ。decltypeの問題とはいえあれはきもい。 括弧は別に何とも思わんしどちらかというと綺麗な部類だと思うが。
>>430 関数内関数を導入するよりも、関数の書き方自体を [] f() -> ret { ,,, } にシフトしていく
方針のつもりでいたんだと予想。
そうすればラムダの記法がそのまま関数内関数になる。
>>436 だけど lambda を引数にとる lambda を返す lambda を...
って, シグネチャ書く気力おきねぇw
>>437 関数ポインタは今のままの書き方でいいってことで…。
もし関数内関数を
>>430 のようにキャプチャあり auto foo = [&]... にするなら
どうせ関数ポインタに入らない。
そういうのを受け取ったり返したりするのは、
template <class Lambda> と書く以上に複雑にはならない。
>>430 そんな差もないし別にlambdaでいいじゃない
それじゃキャプチャも自由にできないし
>>437 そんな複雑なことかいな?
auto bar = [](std::function<int()> f) {
return [=]{ return f(); };
};
lambdaをキーワードにすべき。 基本autoで返してポインタ、参照の修飾だけを指示出来る形で lambda a=(int x=1){x-1};; lambda f=(lambda(int)x){x(3);}; return f(a);
文法はキモいけど キャプチャは重要だと思うよ
443 :
デフォルトの名無しさん :2011/09/03(土) 20:46:05.52
C++って俺の考えた最強言語ごっこできもい
キモいけど感じちゃう
他人のオナニーじゃ感じないだろw
カワイイおにゃのこのオナニーなら感じちゃうかもしれないけどヒゲオッサンのオナニーじゃなぁ。
>>430 GCCみたいな関数内関数を勝手に実装しやがった処理系と干渉するから。
別に干渉はしないだろっつーか、gccの関数内関数は実はC++では使えない。Cモードのみ。
gccは過去にも独自拡張してるけど、 新しい規格により不必要になったり、 バッティングしたら削除してるよ。
func(){ } こういう書き方やめろ。見づらい。 func() { } こう書くように。
pyhonでも書いてろ
ただこれはやめて欲しい func() { hoge... }
なにこのヘミ猫臭い流れ
11 (C++11 の略は 11 なのか?) と何の関係もない。どうでもいい
C++03を03とか略してたなら11でいいんじゃないの
0xと言う呼び方があまりに有名になりすぎた
0xに従えば0bと言った方がしっくりくる気もするが 2進数の接頭辞っぽく見えるという罠も
C++は2進のリテラルもサポートするようになるの?
C++0xはISO/IEC 14882:2011のことで2012年に発行される ややこしい
D言語にはあるよ
ISO/IEC 14882:2011だから結局C++11でいいの?
468 :
デフォルトの名無しさん :2011/09/04(日) 16:45:47.54
9899:1990 を C89 と言うやつ多いし
一体どう呼べば良いんだ・・・
じゃあ 0x0b で
>>463 良くこういう意見聞くけど何が嬉しいのか解らん。
むしろ256進数使えるほうが便利だろうに。
ビットマスクの可読性が16進数と比べて格段に上がる。 16進⇔2進の変換がイメージで浮かぶような変態には意味がない
C++11的には60進リテラルだろ
そんなもんIDE側で表示変えれるようにしたらいいだけと思うが なぜそんな機能を実装したIDEがないかがアメリカ人の大雑把さだよな。
規格にIDE云々を持ち込む方がバカだろ
478 :
デフォルトの名無しさん :2011/09/05(月) 14:43:45.70
>>472 256進数って・・・ 0x00-0x1f ぬきでさえ mラd*%u6EBョフ)61A みたいになるぞ?
確かに昨今はアドレスの類が16進数じゃ辛くなってきているが、
それはただ IPv6 みたいに区切り表記があれば済むことで基数を変える必要はあんまりないだろ
2進数にも16進数にもえこひいきする合理性があるが、これらに対して256進数を持ち出す合理性はあるのか?
''で囲むのが256進数じゃね?
発行、発効、どっちが正しいの?
verilog みたいに _ を使って任意の場所で数字を区切れるといいのになあ。
0xffff_ffff_ffff_ffff みたいに。
>>481 発行 publication
発効 effectuation
483 :
デフォルトの名無しさん :2011/09/05(月) 23:48:54.25
>>482 adaとかそんなのができたよね。
何気にn進数も標準じゃかなったかな
>>481 文書類は発行で、仕様の強制力は発効じゃね?
>>483 区切りはD言語にもあるね
区切りがなくても、WindowsのMAKELONGみたいなのを作れば
一応区切りの代わりにはなる
0xNxAA で AA が N進数だと解釈するコンパイラが昔あった。 0x2x11x200 だと 18。
0x2x11x200 ↑ ↑ ↑ 16 2 3 進 進 進 数 数 数 ということか ややっこいなw
それ32進数とかはどうするの? 大文字限定? 48進数は?
よく覚えてないけど、0-9,a-z(A-Z)の36文字しか使えないから36進数までだった気がするよ。
'x'は使っちゃいかんだろw
491 :
デフォルトの名無しさん :2011/09/06(火) 17:52:47.87
0 で始まるトークンの 2 文字目でなければいいんじゃね 8 進数には使えない文字だし
0x36xxx10は34(十進)か1630404(十進)か?
小文字xはタブーにすればいい
<調査>中国の胡錦濤国家主席、7割の日本人が「嫌い」
2011年9月4日、AP通信と米GfKが共同で行った調査によると、日本人の7割が中国の胡錦濤(フー・ジンタオ)国家主席に対し、
好感を持っていないことが分かった。米華字サイト・多維新聞が伝えた。
調査結果によると、日本人が好きな国は「米国」(49%)が首位で、「ドイツ」(48%)が2位。
一方、中国を「好き」だと答えた人はわずか7%、「嫌い」は76%だった。嫌いな国の首位は北朝鮮で、中国は2位だった。
韓国に対しては41%が「好きでも嫌いでもない」、27%が「嫌い」と答えた。
また、日本人が最も好きな国家の元首や首脳では、「天皇陛下」(70%)が首位。
「オバマ米大統領」(41%)、「メルケル独首相」(28%)、「李明博(イ・ミョンバク)韓国大統領」(20%)がこれに続いた。
中国の胡主席について、「好き」と答えた人はわずか6%、「嫌い」は68%だった。
「好き」と答えた割合が最も低かったのは、北朝鮮の金正日(キム・ジョンイル)総書記の1%だった。
調査は7月29日〜8月10日、日本各地の1000人を対象に実施された。
http://www.recordchina.co.jp/group.php?groupid=54100&type=1
今、CD-ROM発掘して調べたら 2進から16進までだった。すまぬ…すまぬ…
絶対に許さない
>>473 16進数で2進を想像できないヤツがビット操作なんてするもんじゃない。
64bitフルに使うと64桁の値がソースコードに散りばめられるわけだぞ
汚すぎるし、43bit目が立ってかとか見分けるのもメンドクサイ。
じゃなんでアセンブラなんかは 0b とか書けるんだ
マクロ使えよ・・・
そんなゴミみたいな欲求を満たすために追加されたのがconstexprなんだろ
10進数見て2進数がうかぶやつは変態の名にふさわしいと思うが 16進数は0-Fのたかが16種類のビットパターン覚えてれば機械的に読めるので 変態というのはどうなんだろう まあ俺は0,1,2,3,4,7,8,Fぐらいしかすぐ出てこないけどな!
どうしても二進書きたければ自分でoperator""_bでも書けばいい
>>498 アセンブリ言語によるだろ。
というかCPUか。8bit,16bit CPUの時代ならまだbit単位で
書いても煩わしくはなかった。今はもう組み込み環境でもなければ
煩わしいだけ。
unsigned long long x = 0b000100100011010001010110011110001001101010111100110111101111; うん、ありえん
アスキーアート的プログラミング。
507 :
デフォルトの名無しさん :2011/09/07(水) 19:11:45.48
>>497 では16進数ならビット 43 が立っているかどうか、2進数より見やすくなるのか?
// see manual p999 pio pin assign
// .6 .5 .4 .3 .2 .1 .0
//3210987654321098765432109876543210987654321098765432109876543210
unsigned long long x = 0b000100100011010001010110011110001001101010111100110111101111;
test(x);
assert(x & 1LL << 43);
508 :
デフォルトの名無しさん :2011/09/07(水) 19:12:45.84
あ、しくったw まあいい、意味に関係ない
>>504 全部が全部 2 進で書くわけじゃなかろ
(^p^) ニシンソバおいしいです
>>507 当然。ビットフラグなんかの操作に慣れてる者から
すればすぐ解る。16進なんて所詮1+2+4+8の
組み合わせしか無いし。
0xFFFFffffFFFFffff
16桁しかないから、8桁目を中心に左右に見ていけば、
そうそう今何桁目を見てるか考える必要もない。
0x0000010000000000 = 43bit目がONの状態 2進よりはまだ読みやすいわ。
そこまで来るとNbit目がONの時に真になるようなマクロなり用意すると思う
514 :
デフォルトの名無しさん :2011/09/07(水) 21:57:54.30
未だにリトルエンディアンが苦手。 全部ビッグエンディアン、ネットワークバイトオーダーになればいいのに
ビッグエンディアンは人間の都合だから嫌い
43ビット目かどうかとか16進数でも難しいわ unsigned long long x = 0b0001001000_1101000101_0110011110_0010011010_1011110011_0111101111; こう書ければすぐだが
それで_を挿入する桁間違えてハマるんですね?
素直に1u<<42って書こうぜ
>>516 桁の区切り方が素人みたいだ。経験の長いプログラマーらしくない。
520 :
デフォルトの名無しさん :2011/09/07(水) 23:26:31.69
>>511 8+4+2+1 な
ハッタリはばれると赤っ恥だぜw
>>518 多分そういうフラグ作成みたいな用途以外に使うんじゃね。
例えば、フラグでのポートからの信号出力なら
Output8( io_address, SIG1 | SIG3 | SIG4 );;
ってな書き方するだろうし。
>>520 ん?2+4+8+1でも8+4+2+1でも同じじゃね?
>>519 8桁で区切るのが普通だとは思うが
43をぱっと分かるようにするには
10桁ずつ区切らないとな・・・
バイナリエディタは2の累乗で区切られてるから、(↓) 経験が長くて10桁区切りが見やすいという人は特殊な気がする。 00000008 00 00 00 00 00 00 00 00 00000010 00 00 00 00 00 00 00 00
>>507 どうしても2進数使いたいならマクロでも使ったら?
次期C++と言わず明日からでも使えるよ。
32bitの例
B(001111111111,011111111111,011111111111);
8進数の1桁を1bitに見立てる。
8進数は3bit食うので、1塊で掛けない。なので3つに分割。
先頭が00になってるが、8進数で埋めると最大33bitになるため1桁潰してる。
16進数の1桁を1bitに見立てようぜ B(01010101,10101010,10110101,11110010) で 0x##a とかやればいい
>>524 > 43をぱっと分かるようにするには
> 10桁ずつ区切らないとな・・・
ワロタ
529 :
デフォルトの名無しさん :2011/09/08(木) 00:38:37.19
>>522 16進から2進を連想するときは同じではない
0x20 は 32 であり断じて 128 ではない
マクロとしてコンパイル通るかどうか やってないから知らんけど、アセンブリで 2進数使えるんなら、マクロ内でアセンブリに2進数渡してやれば? B(11111111111111111111111111111111b);
>>529 意味が解らない・・・。
0x20は32以外あり得ないのは解るけど、128は何で出てきた?
128は十進数じゃない別の表記とか?
8+4+2+1 = F
1+2+4+8 = F
だと思うけど違いが解からん。
なおかつ
>>529 で余計に分からなくなった。
533 :
デフォルトの名無しさん :2011/09/08(木) 00:57:01.68
バカにも解るように教えてつかーさい。
>>522 の 2+4+8+1 から
1000=2 0100=4 0010=8 0001=1 で
0x20=10000000b=128
という話なんだろうとエスパーした
ワード長が伸びてきて、16進にせよ2進にせよ桁区切りができないと見づらい。 マクロ(というか constexpr 関数)でやれよっていうのは、確かにその通り
>>520 の意味もさっぱりわからんが、
どうもバカそうな話なんでスルーするか。
>>520 は上位ビットは左側に書くものだって言いたいんじゃないの?よくわからんけど。
そもそも、ビット演算を繰り上がりのある加算で記述ところからセンスを疑うが。
10進表記でABCDになる数は A * 10^3 + B * 10^2 + C * 10^1 + D * 10^0 2進表記でABCDになる数は A * 2^3 + B * 2^2 + C * 2^1 + D * 2^0 = A * 8 + B * 4 + C * 2 + D * 1 8, 4, 2, 1はこっから出てくるってだけの話だろ こんなん2進数とか最初に習う段階で勉強することじゃね?
で?
レベル低いよなお前らプギャー
>>540 よくわかりました!
ありがとうございました!!
加算の交換法則すら知らないアホがいる
どこに?
加法は可換だけど、数の表記の順序は左からで固定だから ま、1234をひとりだけ4321と書く世界に生きたいんならご自由に そういう人はア・プリオリな言語みたいなものを使うのは不便でしょうがないだろうけど
>>546 1+2+4+8と8+4+2+1の話じゃなかったんか?
もしかして+記号見えない病気とか?
つまり、
>>544 はLSBやMSBのようなエンディアン概念も知らないようなアホ以下ね
ああ、やっぱり+記号見えてないんだね 可哀想に
>>547 ああ、そっちの話か
俺はそっちの話は知らん
たぶん誤解されやすい加法表記を持ち出した
>>520 がアホなのだろう
1,2,4,8の組み合わせと16進でビット計算出来ないヤツに このスレは早すぎないか? 0xより基礎のお勉強をした方がいいと思う。
>>548 型変換する訳じゃないからエンディアン関係ねえ。
>>552 エンディアンは関係は無いが、2進表記はMSB側から・左から書くわけだから
4桁の2進表記があれば、左から8, 4, 2, 1の係数になっているのであって
逆ではないだろ
加法は可換だが、順序がどうでもいいわけではないということ
つーかお前ら本当に糞どうでもいい自転車置き場の議論が好きだな
くだらねぇ
1+2+4+8から順序を連想するなんて頭オカシイだろ
慣習とか慣用とか
1+2+4+8の順々に対して慣習なんて聞いたことねぇ。 プログラム以前に中学数学レベルの話だろ。 0x81 + 0x18 = 0x99 なんてどうすんだよ。
いち、じゅう、ひゃく、せん、まん まん、せん、ひゃく、じゅう、いち
そろそろ C++0x の話をしようよ。
11
桁数数えるときは下から考えるだろ常考
次スレどうする?C++11 0x14にでもする? そろそろどっかに11いれにゃならんだろ。
0b却下の時もこんな流れで1スレ潰したなぁ 進歩ないなお前ら
>>539 飽和論理和じゃ桁上がりしないから、
純粋に数学特性の説明だとマズイだろ。
7 | 9 = 0xF だと、正しいけど意味が解からんだろ。
C++0x 11 14
>>562 それに検索用に【C++0x】って感じで付け加えるのでどうだろう。
ハイ
C++11 (C++0x) 14
正確に行こう ISO/IEC 14882:2011 (C++11/C++0x) 14
JISはいつくるんだ。 まぁ、JIS規格になったところで、タダで仕様を見られるようになるだけだけど。
573 :
デフォルトの名無しさん :2011/09/08(木) 22:44:29.35
おまえがつくれ!
FDIS落としてないのー
C++0b 0d でいいだろ
というか正式なC++の規格になったんだからC++本スレに合流でいいんじゃね
ここが本スレと思ってた
むしろ旧C++スレをC++03スレにするべきなのか
本スレで0xの話題しても迷惑になるだけだから VCやGCCが正式に0xに対応するまではこのスレは維持する。 でなければ混乱を起こすだけ。
いやもうすぐに次の規格の話始まるから。
それは別スレでやった方がよくね?
shared_ptrは使わない機能にコストを払わないというC++の基本理念におもいっきり反してると思うんですが なんでこんな出来損ないが次期標準に選ばれたのでしょうか?
shared_ptrを使わなければコストなんてかからないから 別に反してない
だが考えてみてほしい、委員会の人的コストがかかるのではないか ひいては限られた人類の時間資源というコストがかかるのではないか 人類が滅亡するまでに使うことができる人月は決して無限ではないのだ・・・ まあ俺はshared_ptr使うんだけど
vectorだって、長さ固定ならただの配列よりコストがかかるし、 stringだってただの配列に比べれば高コスト。 機能にコストが掛からないというのは言語に限った話で、 ライブラリに対しては至上命題じゃない。
至上命題って言葉を使うのは止めようよ。至上命令ならいいけど。
このスレの残りと次スレからは「次期C++標準スレTRもあるよ」ってことでいいんじゃないかな?
まあライブラリも可能な限りコストがかからないように気は配ってるけどね 今回は仕様まで変えて(右辺値参照を追加して)効率化計ったし
591 :
デフォルトの名無しさん :2011/09/11(日) 20:15:33.30
>>587 それは現状な
ライブラリがバイナリ提供という前提のうえでの
ライブラリのユーザにとって決して満足な解ではなく改善の余地が残っている問題だ
どうやって改善するの? ファイルリンケージな、ポインター管理テーブルでも作って、 擬似スレッド(コールスタックでのガベコレイベント)によるリソース解放でもすんの? C++の活躍の場は、組み込み環境もあるから安易にスレッドによる同時管理なんて手も使えないけど。
593 :
デフォルトの名無しさん :2011/09/11(日) 20:35:24.68
使わない機能にコストを払わないって言葉を正しく理解していない人がいるな。 shared_ptr を標準に追加したからといって、shared_ptr を使用しないプログラムが 実行時のコストを払わされることはないってことだから問題ないだろ。
594 :
デフォルトの名無しさん :2011/09/11(日) 20:54:53.56
なんでガベコレが出てくるんだよ コンパイラが最終的にうまいアセンブラ使いと同じコードを吐くまで改善の余地はずっとあるだろ ライブラリが気に入らなければ使わないんじゃなく ライブラリに何を要求したかによる最小のコストであるべきものだ それを妨げているネックがバイナリ提供だと主張した
>>594 だから具体的にどうできるの?
トランポリンみたいに直接機械語を変更するでもいいから、
具体的に同改善できるのか教えておくれ。
銀の弾丸が欲しいだけだろ
>>594 具体例が出せなきゃ、「妄想か。策定グループの判断が正しいな。」としか言えないよ。
shared_ptrを使わなければ実効バイナリにshared_ptrのコードは含まれないじゃん 要求しない分には最小コストになってるじゃん
それがわかってない馬鹿がいただけですよ
600 :
デフォルトの名無しさん :2011/09/11(日) 21:14:24.22
それを言うなら shared_ptr に対する要求がサブセットであることと shared_ptr を全く使わないことを、同じであることにしたいだけの馬鹿がいるだけだよ これで具体的にどういうことか通じない御仁に付き合ってやりたいやつはそうしたらどうだ? (俺はパス
>>598 流れと関係ないけど、リンケージって何処まで仕様が決まってんだっけ?
インタープリタやLLVMで動くから、コンパイル & リンクは仕様の範囲じゃないよね。
リンク段階なしでもあり?
>>600 じゃそのサブセットってのは何を要求していて、
具体的にどう機能を変えることで対応できるの?
>>601 shared_ptrはテンプレートだから
使わない限り実体化されないだろ
インタープリタでの使用は仕様じゃ考慮してないんじゃなかったっけ?
>>603 いや、shared_ptr関係なく純粋にリンケージの事。
使ってもない関数が結構リンクされてるのがウザイ。
仕様上あれを全部除去する余地はないのか?
一応仮想関数が無理なのは解る。
C++なんて最低限、new deleteと例外用のランタイムだけ
リンクすればいいでしょ。
LTCGを仕様に含めろとか馬鹿な事を
>593が回答だろ。 >584 >587は単なる勘違い。
>>606 LTCGじゃなくclangみたいな方法でもいいじゃん。
とにかく、外部に公開しないような関数は根こそぎ
消すことを義務化してほしいね。
>>608 つまり関数はデフォルトで内部結合にして、
外部に出すには extern つけなさいってことか?
>>610 リンク時のシンボルテーブルから、参照されてない関数見つけて
その関数を領域ごとごっそり消せばいいって事でしょ。
関数の長さが解らないから、関数のマングリングに関数のバイト数を追加したりする
必要はあるだろうけど。
>>611 そんな具体的なところにまで規格は踏み込めないよ多分。
規格は、ここに述べることと外から見てそっくり同じ動きをするバイナリなら
どんな風に翻訳しようが構わないってものだろう。
不要な関数があろうがなかろうが外側からみた動きは変わらない。
それに、些細で不要な関数を消してもどうせアライニングの関係で
パディングしなければいけないとき、
その関数を消すのをさぼったからといって規格不適合っていうのも無理がある。
>>612 やっぱ規格上でその規定はむりか。
今時、crang,gcc,armcc,optimize compilerと実装は違えど
大抵のコンパイラで、できる機能なんだけどな。
それを言ったら最適化もって事ではあるけど。
614 :
デフォルトの名無しさん :2011/09/11(日) 23:36:54.72
確かに規格の死角ではあるね 考え落としではなく、触れるわけにいかない事項だが コードサイズの増加が無害と思い込むのは狭い視野での早まった結論だ
vtableの仕様すら規格で決まって無いのに、お前らお花畑だな。
実行バイナリには不要な関数コードが10%以上混在してはならないとか 実行コードは物理的なCPUネイティブ?で実行されなくてはならないとか 1組み込み演算コードは1KB以内に収めるとか1000サイクル以内に実行できるとか そんなん言い出すと法律家みたいな判例と解釈の専門家が必要になる気がする
言語規格だけが規格でもなし、ある程度の標準化求めるにも もっと別のベンダ寄りなとこに出す話なんじゃね。言語の理念は理念としても。
意味を左右しない実装の自由が残ってるのは良い規格である証拠。
行列計算なんかオペレータ使うとアレじゃん? このあたりはなんとかなならないの
アレとは
621 :
デフォルトの名無しさん :2011/09/12(月) 14:34:21.12
http://www.open-std.org/jtc1/sc22/wg21/ News 2011-09-11: The new C++ standard - C++11 - is published!
News 2011-09-11: The deadline for the next mailing is 2012-01-13
News 2011-09-11: The 2011-07 post-Bloomington mailing is available
News 2011-09-11: The C++ Standard Core Language Issues List (Revision 77) is available
はええな 可決されてからほぼ一ヶ月か
>>619 一時オブジェクトがどうこうという話なら右辺値参照で解決された
>>623 あれま、そうなんだ。
ポインタ含まないような構造体でも解決されてるのか。
>>624 行列計算程度ならね。
たとえば a+b+c+d = ((a+b)+c)+d は、
二回目以降の足し算は T operator+(T&& x, const T& y){ return x += y; } を使えばコピーは起こらない。
(戻り値のコピーは RVO で消せる)
>>625 そういう問題じゃないんじゃね?
Expression Templateを使うような問題だろ。
最終的にこういう感じで展開されなきゃならんと言う話。
n[i] = a[i] + b[i] + c[i] + d[i];
628 :
627 :2011/09/12(月) 22:28:48.84
Visual Studio vNextのC++11対応に失望した
nested lambdaがバグるコンパイラってなんなの
C++11対応にまともに取り組んでると言えるのはGCCとIntelくらいか
早漏気味に対応してたBCCはどうなの あとexportに定評のあったComeauとか
>>631 欲しかったものがatd::atomicぐらいしか入ってねー
今まで何やってたんだって感じだな
vc10から変わってないじゃないか
Visual Studioにそういうの期待する方がおかしい。 あれはMSの現フレームワークの開発環境提供が第一義。 ISO C++の部分だけベータリリースしてもいいんじゃないかとは思うが。
wikipediaのc++0xをc++11に転送するようにできないものか
してくりゃいいじゃない
英語版は二週間くらい前に転送されているからあれ?と思ったら、 日本語版はまだC++0xしかエントリないんだね。 ただ日本語版は、そういうことより、 > 標準化の作業はようやく完了しC++11という名称も定まったが、 > 本項は必ずしも最近の C++0x の状況を反映してはいない。 こういう奇っ怪な文章を直したらどうかねえ。 「が、」で継続するなら二行目も「C++11」の方がだろう。 C++0x命名の長い解説が最初のサマリーのところに入っていたり。 まあ日本語版見てる人が少ないんだろうけど。
VisualStudi2010で動かなかった lambda動くんじゃなかったの? template<typename LHS, typename RHS> []AddingFunc(const LHS &lhs, const RHS &rhs) -> decltype(lhs+rhs) { return lhs + rhs; }
c++11のlambdaはmonomorphic
auto NamedLambda2 = [&](int a) { return a + b; }; boost::function_traits<BOOST_TYPEOF(NamedLambda2)>::result_type c=5; //bug?? boost::function_types::result_type<BOOST_TYPEOF(NamedLambda2)>::type c=5; //bug? NamedLambda2のresult_typeってどうとればいいんだ
decltype(NamedLambda2(0)) c=5;
>>645 c++11ではそもそもlambda式のテンプレートはできないし。
// これは関数テンプレート
template<class LHS, class RHS>
auto AddingFunc(const LHS & lhs, const RHS & rhs) -> decltype(lhs + rhs) { return lhs + rhs; }
int main()
{
cout << AddingFunc(1, 2) << endl;
cout << AddingFunc(3.3, 4.4) << endl;
}
decltypeの中が複雑だったり、関数のスコープ内で定義された変数を含む場合ってどうするの?
型だけ見る
652 :
デフォルトの名無しさん :2011/09/15(木) 22:16:45.06
>>625 演算子を用いた(a+b)*(c+d)*eとかの行列計算もokでしょうか?
>>652 右辺値参照ををオーバーロードするライブラリを誰かが作ればOK
「テンポラリを無駄に生成したくない」という問題だけなら解決する。
( (a+b)*(c+d)*e なら c+d のテンポラリは消せないけど)
lambdaみたいにreturnから推論できればいいのにね 定義必須になるけど、どうせほとんどの場合テンプレートで使うんでしょ
そもかわりlambdaはresult_typeがないので boostと組み合わせると大変なことに
なんでそんな事に・・・
もう拡張だけで頑張るのは無理な次期にきてるんじゃないかな
std::function<int()> a; std::function<int()>::result_type b; ← OK decltype(a)::result_type c; ← Error! expected initializer before ‘c’ これはGCCのバグというか、まだ実装途中ってことなんだよね?
ファンクタの状態や()のオーバーロードいらないなら素直にlambda使えって話 int main() { int x = 11; double y = 22.22; vector<int> v1 = { 0, 1, 5, 10, 100 }; vector<decltype(x + y + v1[0])> v2; transform(v1.begin(), v1.end(), back_inserter(v2), [x, y](decltype(v1[0]) i) -> decltype(x + y + i) { return x + y + i; } ); for(auto i = v2.begin(), e = v2.end(); i != e; ++i) { cout << *i << endl; } }
>>659 decltypeをnested name spacifierとして使えるようになったのはごく最近のこと。
土壇場のギリギリになってから規格に入った。
だからgccはまだ対応してない。
こんな短いコードで変換できちゃうの?
declarationを人間が入力することで型推定を人間がやってるから短くなる
666 :
デフォルトの名無しさん :2011/09/16(金) 16:16:28.24
なんだかなぁ。右辺値参照とか、decltypeとかconstexprとか 複雑さをもたらすだけだな。autoは便利だが。 overrideには笑った。virtual関数使う奴が引数を間違えるかねぇ。 finalはあっていいけど。 いろいろ機能拡張してるけど、それはSTLなどのライブラリ作る職人さん 達が使うものとして、新しい機能にあれこれ手を出すのはやめた。 使いたいのはスレッドとスマートポインタ、unourdered set、map ぐらいでいい。
つ チラ裏
668 :
デフォルトの名無しさん :2011/09/16(金) 17:06:20.97
はいはい
>>666 overrideつけたのはベースのクラスで引数変えて、派生クラスで
引数変え忘れとかのケアレスミス防止だろ、
今のコンパイラでも警告出たかどうか知らないけど。
他人のコード引き継いだりしたときはミスしそうなとこだろ。
こういった機能やスレッドにしても0xはいまさら感なところも多いね
個人的にはC++はめんどいイメージが最近は大きくなってるから
ある程度、楽に使えるようになってきているのはいいんじゃないかな
non copyable は delete 指定でできるみたいだけど
コーディング量的に微妙か?w
以上、チラ裏
overrideないとエラーになるならいいんだけどねえ
671 :
デフォルトの名無しさん :2011/09/16(金) 21:56:11.59
C++0xをシェイプアップして キモいメタプログラミングを構造化言語で記述する仕様を付けて出せば最強言語
673 :
デフォルトの名無しさん :2011/09/16(金) 23:31:47.94
>>672 賛成。テンプレートやメタプログラミングも過渡期の段階だろう。
もっと簡潔にしなければならないよね。ま、大変な作業だろうけど。
しかし、最近のビヤーネさん、禿に磨きがかかっているねえ。
C++11の複雑さも磨きがかかってるけど。
科学、工学、他分野の技術系の人にとっては、計算やアルゴリズム
が大事だから、文法が簡単な言語を使う(最近は工学関係もMATLABや
Octaveが浸透してきた)。どうしてもスピードが要求されるところ
にはFORTRANを使う。C++はあまりにも言語が自己主張しすぎる。
複雑なC++の習得に時間をかけるのは本末転倒。
>>672 の発想で作られたD言語という失敗作があってな
>>673 > どうしてもスピードが要求されるところ
> にはFORTRANを使う。
C++には満足な並列構文がないじゃん
やっとスレッドの概念が規格化された言語に並列構文とか無茶言うな
D言語は仕様が固まれば・・・
Dは失敗したけどそのうち取って代わる言語が現れて C++の仕事は過去の遺物の保守と移植だけみたいな状況が来るよ ジョンタイターと飲みに行ったときに彼ももそう言ってた
Vita にもいよいよ C# 来たしなあ。 どの程度なのか知らんが。
10年以上前から言われてる気がする
>>679 XBLIGでC#使えるのと同じぐらいのインパクトしか無いんじゃないかな。
360でC#使えるけど、C#っぽい楽な書き方してるとGC走りまくって使い物にならなかった。 GCが問題無いくらいVITAが速いならいいけど。
ドイツ語ってすごい文法も奇麗だし 読みがそのままスペルでいいよね でも現実にはいろんな言語のいいとこパクったり ぐちゃぐちゃな拡張してきた英語が広く使われている 仮にドイツ語が広く使われたとしても 結局ぐちゃぐちゃな拡張される事になると思う
ドイツ語の読み書きが出来る人? それとも聞きかじっただけ?
>>683 Wikipedia一回見れ 恥ずかしすぎるお前
リンカエラーやデバッガの出力で壮絶なmangled nameを見ると ドイツ語の複合語が連想される、まで読んだ
demangle して読まないの?
あれ?C#ってGCコントロールできるんじゃなかったっけ?
日本語読めないヒト科?
>>688 処理系による。Windowsの.netなら発生頻度はある程度コントロール出来る。
360とかWPは無理。Monoは知らない。
.net by auェ・・・
そういえば、ラベル付きbreak/continueは常々ほしいと思ってたんだけど、 C++11から敢えて外した理由ってあるの? それともほとんどの人は多重ループからの脱出とかしないの?
>>692 そんなの作ったら巨大な関数が今よりもっと増えそうな気がしていいやだな。
関数作って return を使うプレッシャーがあるぐらいでちょうどいいんじゃないかと思う。
switch (a) { case 0: ... break; case 1: ... goto 0;//とか出来たらいいなあ }
C#やDではgoto caseがあるっけ
……C#使い始めて結構経つけど今初めて知ったよ。
auto DoubleLoop = [&] { for(...){ for(...){ if(...) return; } } }; DoubleLoop();
>>693 結局goto使うか、エラーでもないのに例外使うか、
それとも
>>697 みたいな黒魔法に走るか(俺なら変数宣言もしないけど)するだろうから、
それならラベル付きループの方がいくらかマシじゃないかなあ
それに、どうせループの中でスコープ切れてるから、
ループによる関数の巨大化の弊害はそんなにない気はする
>>692 必要ないです。
上手く構造化出来なければ、普通にgotoです。
whileとか必要ないです 普通にgotoです と同レベルだぞそれ
いいえ全然違います。
同レベルだよ gotoじゃ意味を言語的に記述出来ない
[&]{ for(...){ for(...){ if(...) return; } } }(); そんなに黒っぽくないような気がする
本当にreturnしたい時どうするんですカー
>>704 はやくllvm clangでも動いて欲しい
生成される機械語を考えたらgoto一択と思いたいんだが、LLVMなら
>>704 も最適化されるんだろうか?
clangはクソblocksさんが普及するまでラムダさん実装ボイコットじゃねーの
即使用のラムダさんは 最適化でinline化するのがベストではあるが
最適化するために(mutableをつけない限り)全メンバが const なんだと思う
最適化にconstって関係あるの?
ないな。 変更されてるかどうかなんてコンパイラが勝手に解析すればいいし、constなんてキャストで外せるんだから信用しちゃだめだ。
const値は定数に置換される事が仕様で決まってる。
アホー知恵遅れに
>>713 みたいに定数値で初期化されることが抜けている奴がなにか喚いてたな
>>713 規格中のどこの規定のことを言っているのかね?
716 :
デフォルトの名無しさん :2011/09/18(日) 12:30:36.76
goto hell; //hell へ行く。で、何がしたいのか? while(hell) //hell の間繰り返す。で、何がしたいのか? どちらも「意味を言語的に記述」はしていて、意図を記述していない これで while をえこひいきする客観的な理由は何だ? Dijkstra の教えがどうたらじゃなく
どうでもいいことに必死だな。 マルチスレッド対応のほうが大事だろ。
719 :
デフォルトの名無しさん :2011/09/18(日) 12:41:24.47
聞かれたら困る、まで読んだw
煽るのは適切なスレでやってね
>>716 C++的にはgotoだと上方向に飛べるからコンストラクタやtryをまたがれると云々とか。
>>716 gotoは制御のネストを破壊する。
break,retrun,continueに於いてはネストを
下げるだけの操作だからgotoとは別。
このスレで、スレ違い、さらには初心者レベルなネタをだすな。
今時、gotoアレルギーの人が多いんでびっくりした。
ステートマシンとかに使えて便利なのにな
ステートマシンぐらいオブジェクトで組めよ。 そっちの方が楽だろ。
727 :
デフォルトの名無しさん :2011/09/18(日) 19:47:31.29
>>721 コンストラクタや try をまたぐ問題は上方向か下方向かには関係ないと思うぞ
>>723 破壊というと何か不都合なことが起きるとでも言いたげだが具体的にどういうことだ?
なあ熟練者さん、continue は「下げる」のか?
# goto や多重継承についてドライに何か尋ねると高圧的になる人を魚っ血中
# これから出かけるところで帰りは明朝 (疲れる用事なので寝てるかも)
continueは、ネストの範囲を狭める。 どっちかといえば新しいネストを作り出してる方だな。
匿名掲示板でそーゆーこと書いちゃうのは後釣り宣言と変わらんぞ
横レスだけども、 gotoはコードの原則を変えてしまうので問題なんだろう。 つまり、下に流れるということ。 俺は、下に流れるgotoは許容してるな。 あんまり使う機会もないけども。
>>727 くだらねぇ事相手にしたくないけど。
再利用が効くからってこんなコード書かれたらどう思うんだよ。
label2:
if(・・・)
{
・・・・
label1:
・・・・
goto label2;
}
else
{
・・・・
goto label1;
}
>>730 俺も迂闊に上とか言っちゃったんで
>>727 で実につまらん反論されたけどさ(元々の意図と異なるので相手にしないけど)
迂闊に下とか言っちゃうと↓みたいな揚げ足取りがきっと来るぞ
goto L;
t obj; //コンストラクタが動く
L:
>>732 そういうのは趣味でやってるうちに、頭の中で最適化されて消えてくモノだと思うんだけどねぇ。
来たら来たで、なんでそうなった??って聞くだろうし。
>>731 書いたその日はいいかもしれんが、手直しが必要になったら関数の中まるごと消すわ
議論が変な方向に行ってるな gotoによる多段break/continueと ラベル付きbreak/continueの違いは gotoという構文を見ただけでは それがbreakなのかcontinueなのか それとも他の処理なのか分からないということだけが問題 他の問題は些末な事だよ ラベルを工夫すれば人間に分かるようになるが、あくまで苦肉の策 最初はbreakのつもりだったけどやっぱcontinueに変えたわ、とかで ラベル変更しないアホも出る可能性のある不確実なもので、 どう見てもcontinueなのにラベル名がBREAKになってるとかもあり得る諸刃の剣 あくまで多段break/continueの構文がないし goto以外のworkaroundはどれもgotoより醜悪だから 仕方がなくgotoを使ってるだけで、 構文があった方がいいのは間違いない
バカがバカなことできるってのが問題なんだろな
研究畑の人間がいじる可能性のあるコードは特に危険 プログラムとか適当でも理論を実証できればそれで良いと思ってるから 可読性とか安全性とかほとんど気にしない(というか興味も知識もない)ので ラベル名変えないとか普通にあり得る ラベル付きbreak/continueはC++1xではどうなるんだろう
gotoはbreakと同じだと思ってるヤツは、 gotoは2重forから2重forのど真ん中に 飛び込んだり出来ることをよく覚えとけよ。
ラベル付きより番号指定のほうがよくね。 名前考えるのメンドイわ。 break 1;//一段抜ける break 2;//二段抜ける break 3;//三弾抜ける
こんな感じの解決案 #define do_bbreak(a) {typedef int illb#a; #define bbreak(a) {typedef illb##a dmy;goto l##a;} #define close_bbreak(a) {typedef illb##a dmy}l##a:;} #define do_bcontinue(a) c##a:{typedef int illc##a; #define bcontinue(a) {typedef illc##a dmy;goto c##a;} #define close_bcontinue(a) {typedef illc##a dmy;}} do_bbreak(a){ do_bcontinue(a){ if () bbreak(a); if () bcontinue(a) }close_bcontinue(a) }close_bbreak(a)
多重ループ脱出以外でのgotoの使いどころを教えてくれ
>>742 そんな迂闊に for や while 書く奴なら、何やってもバグるだろう。
>>739 これカウントが逆のほうが良くないか?
break 0;//一番外を抜ける
break 1;//二段目を抜ける
>>744 よく見るのは関数終了前のエラー処理に飛ぶタイプ。
finally節的な使い方。カーネルのソースでもしょっちゅう見る。
PL/1がカウンタ方式じゃなかったかな。
なんかいっしょのプロジェクトやりたくない奴ばっかだな
デストラクタちゃんとしてれば要らんよな。
>>750 数値をマジックで書いたら全部アウトかよ。
break 0;を見てなんと間違えたり、
どの値と同期とったりするんだ?
まぁ配列の添字も即値だし、switch caseも即値だし、 名前付けたら他の構文と同じく定数定義したらええんちゃうん。 const int FUNCTION_SCOPE = 0; const int LOOP_SCOPE = 1; const int LOOP_THE_LOOP_SCOPE = 2;
>>748 の方式だったら大して困らんだろ?
なんかあるの?
>>759 ネスト増やしたらコードの意味が変わっちゃうし
そもそもコードが見ただけで何を意図してるのか分からん
それを定数変数やマクロで置き換えた所で修正も面倒
gotoの方がよほど保守しやすい
>>749 あれ何らかの理由で例外飛ばせないケースでは自然だよなあ
>>760 ネスト増やしたらコード変わるの当たり前じゃん。
break n;と定義されてて、ループ抜ける以外の意図って何感じるの?
gotoの方がループ変わるたびにラベル管理しなきゃならなくてよっぽど保守しづらいけど。
>>762 だろ。ループ抜ける以外の意味しか無いのにgotoでラベルつけんのも頭おかしい。
>>739 それはやめてほしい。
今でも if 文の閉じ括弧とループ文の閉じ括弧が混じってると
break でどこに飛ぶのかわかりにくい。
それが何段も抜けるとかもう意味不明
今時クソカスコボラーが新規にC業界に殴りこんでくるわけでもなし 事実上goto=脱出と思っておいていいと思うんだが
一応聞いておくけど構造化定理くらいは知ってるよね?
>>716 まず質問の意図を確認しておきたいんだが、
1. お前らなんでwhile使うの?ifとgotoで同じことできるじゃん
2. お前らgoto不要論についてどう思ってんの?
>>716 は1のように見える(明らかにwhileとgoto比較してるし)が、普通知りたいのは2だよな。どっちなんだ?
>>768 forの中からforのど真ん中に飛び込んだり
ifの中からforに飛び込んだり
forからifに飛び込まんでもプログラムは書けるから
すんなよって話だろ。
>>766 お前に break を扱うことは無理ってことだな。
>>766 構文としては既にgotoあるんだから
増えても変わらんだろ。使わなきゃいいし
権力あるならコーディングルールでしばりゃいい。
そんなもんより本物のfinallyをだな。デストラクタよりこっちがプリミティブなんだから……
どうでもいい
>>772 if の括弧なのか ループの括弧なのか考慮しながら、
「1, 2, 3,.. 4 ここに飛ぶのかー」
みたいなのは疲れるよ。break ラベル; のがずっといい
>>768 goto使わない限りコードのコピーをしなければならない
プログラムフロー構造があるのはご存知ですか?
finallyなんか何に使うんだ? 具体的な用途がさっぱり解からん。
なにやら break N を使わないといけないという強迫観念患者が混ざってるぞ。
>>775 whileとforの数を数えればいいだけだと思うが?
まさか4重ネストとか常用してんの?ループなんてせいぜい3が限度だろ。
>>777 >>749 catch(...){ ... throw; }なんてのは割りとよく見かけるんだからfinallyが使えたほうがずっと素直。
unique_ptrのカスタムデリータにラムダ渡してそこで……なんてやるより直接書けたほうがいいだろ?
>>779 775 にかかれば五重六重ネストなんて日常茶飯事だよ。
……こいつに C は無理だ。
おまいらマクロの存在を忘れてないか? 見掛け上のネストの数と合わないかもしれないぞ。
マクロで暗黙のループが発生するってどんなクソコードだよ。
マクロの中で特別注意することも出来ない奴は死んで良いよ
>>779 ゴミプログラマの書いたコードを誰も読まなくていいなら goto は問題にならない
多重ループ使いまくって break continue 多用するバカは
そのループ自身も長いし入り組んでるんだよ。break で飛ぶ先がずーっと下にある。
多重に抜けるってことは、単純な break よりもずっとかけ離れた場所に飛ぶってことだろ。
それを数かぞえながら追うとか悪夢でしかない。
素直に検索で飛べるラベルがいい。
>>780 >catch(...){ ... throw; }なんてのは割りとよく見かけるんだからfinallyが使えたほうがずっと素直。
意味が解からん。catch(...){ ... throw; }なんてfinallyと用途が全然違うでしょ。
正常系じゃfinallyと違って動かない。
>>784 書いた奴が死んでもコードは残るんだよ。
>>785 だからラベルが欲しいなら定数使えばいいでしょ。
caseだって同じじゃん。あと、バカが居るなら仕事でしょ
レビューで止めればいい。過去に使われて直せないならgotoだって同じ話。
てか、長いループだろうがbreak n;で検索なんていらんだろ。
labelなら要るだろうけど。
>>788 定数にしてもどの行に飛ぶかわからんだろうよ。
それにプログラムを読まなくちゃいけないのは、専業プログラマだけじゃない。
科学系研究者の書いたコードなんて現状クソ以外の何物でもない。
しかも有名な奴ほど腐ってるんだ。あれをさらに腐敗させるようなのは導入してほしくない。
>>786 catch(...){ throw; } がある場合、gotoによるfinally処理は記述が難しいんじゃないの? ってことだと思うよ
もし、「超簡単だよ!」って思ったらcodepadで書いて見せてほしい
たぶん、
>unique_ptrのカスタムデリータにラムダ渡してそこで
これより簡単になることはないと思う
>>786 その前後で例外が発生してない時も同じ後始末をしてるコードを見たことがないのか?
それに例外が発生してるときに限定したって、catchするとランタイムが例外オブジェクトを捕まえないといけないので
結構裏で処理が走ってるし、C++の例外の形になってないunwind操作がもしあったらすり抜けてしまう。
bool flag = true;
try{
例外が起きるかも
flag = false;
}finally{
if(flag) 後始末
}
のほうが、実は軽いし補足できる範囲も広いんだよ。
C使ってた頃ならまだしも、C++使い始めてから、クラススコープ以外でリソース生成した事ないわ。
>>789 だからgotoと同じだって
理論的じゃないなぁ。
>>789 例外構文も使えそうに無いな。てか絶対使うな。取りこぼしそうだから。
インデントはループに限らないんだから、ループかどうか見るために上を見て、 次に飛び先を確かめるために下を見ないといけないってのはあるなあ。 break nだとそれがn回か。 よしループの最後にEND WHILEって明記しようぜ。それならbreak nも有りな気がしてきた。
>>791 その処理具体的に何するの?
ディスクリプタのクローズ?
メモリーの解放?
ロックの解除?
>>793 同じじゃない。goto は飛ぶ先が必ずラベルだから、検索すれば思考せずに見つけることができる。
多重 break で飛ぶ先に数字を使うなら、
今の上のループの、上のループがどれで、どこで終わっているのか探す手間がかかる。
for(){ for(){ if(){ break 2; } } } みたいな一目瞭然の場合だけを考えているなら別だが。
>>794 実際使えてないアホばかり
>>795 ifブロック1つが100行、forブロック1つが200行。
そりゃ大変だね。もうループの条件判定だけで
抜けるようにしたほうがいいんじゃない?
>
>>792 finallyだって頻繁に使いたくなるというわけでもない。そうやって組んでる中でごくたまに使いたくなるだけなんだよ
そのごくたまに使いたくなる時のみでさえ、
>unique_ptrのカスタムデリータにラムダ渡してそこで
みたいなfinally節の代替物が関数の先頭に来るやり方になにかもやもやしたものを感じるのでfinallyがほしいなぁと思うことがあるだけ
>>796 >>791 じゃないけど俺は忘れた。少なくともここ5年はほしいと思ったことすらない
どうせbreak番号導入されたら統合開発環境に、ネスト数補正とか追加されるから気にすんなって
802 :
デフォルトの名無しさん :2011/09/18(日) 23:00:38.53
いやね、ロケットの軌道計算とか、制御とかには例外処理は必要だろうよ。 ヘタすると宇宙のかなたにとんでいくし。 ロボットの制御には逆運動学計算が必要だし、それに基づいて制御する ときにも例外処理は必要。突然暴走して人間を殴る殺人ロボットになる かもしれないし。 当然、ATMシステムに例外処理がないと(COBOLシステムにそれに類した 対策はあるよね?)とんでもないことになるし。 しかし、ただの数値計算に例外処理を導入しても、根本的にアルゴリズム というか、プログラムにエラーがあるわけで、例外処理で正常な計算に戻 せるわけがない。プログラムを見直して、初期値やデータを与えて計算を やり直すしかない。 だから、分野によってはそれがないと致命的かもしれんが、普通の数値計算 では例外処理なんてどうでもいい。C++の掲示板とかBlogには大事だと書かれ ているが、それは分野による。騙されるなw
>>802 横レスするが、ロケットとか人工衛星って、電磁波の磁界通過の関係で
高性能CPUはつまんから例外処理とかもタブーよ。
とりあえず待機系を20個とかバカみたいに動かして、
異常が起きたら片っ端からリセット。
>>796 そりゃほとんどは確保と解放が対応付いてるよ。そういうのはクラスにすればいい。
>>800 も言ってるけど、超稀に対応が取れないレアケースがある。
そういうときにunique_ptrとか持ち出すのもなんだかなーってだけ。
あとまあどうせ1箇所でしか使わないのにいちいちクラス化するのもめんどくせーとか。
>>803 こないだ小惑星から帰ってきた人工衛星もそんな感じだったよね。
回路つぎ変えて対応とかさ。
>>802 コンストラクターと演算子でどうやってエラー返す気だろ。
>>806 まあunique_ptr+ラムダで済むから、ローカルクラス作って云々やるよりは遥かにマシになったのは事実なんだよなあ。
既にcatch(...)を書いてる人たちもこれに置き換え……てくれる見込みは全くないけどさ。
shared_ptrって実際どういう用途に使われるんだろ。 Factoryクラスとかに使われるんだろうか憂鬱だ。 newしたクラス以外は所有するオブジェクトを deleteしない。原則自動変数を使うを守ってりゃ済む話だったのに。
>>799 一番外まで脱出するケースでしか意味ないじゃん
>>783 #define X(略) do { 略; } while(0)
は、全く見ないってもんでもないだろ。
>>809 何らかの管理クラスに一括して管理させたいときだな
他で作って、管理クラスに突っ込んでおく
break 番号、って、なんかこう……goto 行番号を思い出す……
>>810 いや、ループのネストが増えようが減ろうが脱出ループは変わらなくなる。
>>812 そのまとめるオブジェクトを関数スコープかクラススコープに置いといても変わんないんでしょ?
labelはアセンブリを思い出すな、というか現役で使ってるから混じるな。
>>815 俺の認識間違ってるか?
while (A) {
while (C) {
while (D) {
break 1; // Cを抜ける
}
}
}
while (A) {
while (B) { // 追加
while (C) {
while (D) {
break 1; // Bを抜けるようになる
}
}
}
}
あってるよ。必ず外から2個目を抜ける。ラベルみたいに書き換える必要はない。
4重ループとか頭おかしいだろ・・・ goto以上に読みづらいわ
>>818 gotoでもラベルの位置変える必要があるよな
Bの前か後かは絶対決めなきゃならない
break n;の件だけどあれじゃん 要するにnに関数ブロック以上の制御ブロック全てを含めりゃ ネストの深さだけで判断できて解決するんだろ オフサイドっぽいかんじで
>>811 Cでは便利でもC++で使う意味はあまり……
実用上gotoで十分と思うけどねえ。nがそこまで大事な子に見えないし。
>>811 そんなモンの中に break 突っ込む奴はイカレてるだろ。
まぁ今更締め切られたもんに機能追加する妄想しても仕方あるめェよ。
>>821 while(C)についてるってのは変わらんだろ
ループ追加しても普通は位置なんて変える必要はないのだから
大して問題にならない
ネスト深くなるからって関数化する時もラベルならそのままコピーできる
なにより定数で置くにしても
最終的には自分で数を数えて書かないといけないとか
バグの温床じゃないですかー
switch(x)do { default; break; case 0: retrun 0; case 1: }while(0);; ある意味最凶やね
>>826 Bについて値を変えなくていいのは変わらんし
五十歩百歩目糞鼻糞。
>>827 何十年後になるんだろ。
そういや詳細知らないけど前回は03だっけ。
03はマイナーチェンジだから実質98と考えた方がいい
プログラムの最初から最後まで使う→main関数で値を持つ 2つのウィンドウ等で共有する→ウィンドウを所有するオブジェクトか関数が共有するオブジェクトを持っておく 条件によって返すオブジェクトが変わる関数がある→関数でなくオブジェクトにして保有するオブジェクトをきりかえてやればいい。 share_ptrの必然性はないわな。
誰も言及していないけど break n は php には既にある。 内側から n 個目のループを抜ける仕様。
最後日本語でおk てか右辺値参照のおかげでただ返すだけならunique_ptrで良いし
昔は配列にnewしたの突っ込む時はptr_vectorかshared_ptrのvectorを使ってたけど 右辺値参照のおかげでunique_ptrのvectorで十分になったので shared_ptr使うケースは減りそうだな
837 :
デフォルトの名無しさん :2011/09/19(月) 01:39:33.61
>>738 出来るからするなんて誰も言ってないと思うが。
>>809 ,831,833
こういう考えの人って多いの?
複雑なアプリケーションでは所有権が頻繁に移動するケースがあるから
shared_ptrが標準に取り込まれたと思うんだけど
所有権の移動を自力管理しないのは怠慢/所有権を移動するような設計がアホ、とか言われちゃうんだろうか
うーむ・・・周りに嫌がられたくないし、しばらく使わないでおこうかな・・・
>>838 移動ならunique_ptrでいいんじゃない?
基本的に自動変数を使えばいいってのはその通りだが
Factoryに削除のためのインターフェースをつけるのは俺はやらないな
所有権をunique_ptrに移譲してしまえば使い終わった/例外発生時に自動削除してくれるのにそれをわざわざ手動で削除することもないだろう
>>838 所有権を共有するわけでもないのに shared_ptr 使うのはアホだろ。
名前見ろっていう。
>>840 まぁそれはある意味仕方がない
0x以前は"移動"がなかったんだから
>838 所有権が移動する場面の安全対策は重要。むしろRAIIを使わずに管理するのがアホだろ。 極端な話、shared_ptr吐き出すnewがあっても良いと思うが。 あとはリソースを複数オブジェクトで共有する場合はshared_ptr必須だね。
なんでだよー。わかってて使う分には(特に移植性とか)最強なのに。 あ、コンテナは boost ptr_container ね。
他の言語にあるのに何でC++11に入らなかったんだリスト ・ラベル付き(or ネスト数付き)break/continue ・finally ・プロパティ ・restrict修飾子 まだまだある?
C99のdesignator
C++ってrestrict入ってないのか・・・
finallyはRAIIで代用出来るから要らない というよりは、finallyがあったとしてもなるべくRAIIを使うべきというくらいだ
851 :
デフォルトの名無しさん :2011/09/19(月) 06:46:31.90
>>847 restrictはC99だから上位互換として実装されるんじゃないの?
されないよ 別にC++はC99との完全互換は目指してないから
853 :
デフォルトの名無しさん :2011/09/19(月) 06:51:18.91
>>850 上にもあるけどラムダで済むようになったしね。
汚いネストが減る分こっちの方がいい。
まあunique_ptr使うよりは、それなりのクラス作った方が分かりやすくはあるかな #include <iostream> #include <functional> class Finally { public: Finally(std::function<void()> f) : f(f) { } ~Finally() { f(); } Finally(const Finally&) = delete; Finally& operator=(const Finally&) = delete; private: std::function<void()> f; }; int main() { FILE* fp = NULL; Finally f1([&]{ fclose(fp); }); // fpを使う } 先に後始末を書くあたり、D言語のスコープガード文に似てるね
855 :
デフォルトの名無しさん :2011/09/19(月) 09:13:49.66
>>847 前々スレ位に出てたけどシンボル。
function(this, &Type::Function);
とか書くのがだるい。
function<Function>(this);
と関数からシンボルを独立させて渡したい。
メンバ関数ポインタの取得でクラス名は必須だけど、 そうなった経緯ってどんなの?
857 :
デフォルトの名無しさん :2011/09/19(月) 10:02:42.95
VC6はメンバ関数名だけで取れてたし、実装できないわけじゃないでしょ?
ばかか
860 :
デフォルトの名無しさん :2011/09/19(月) 12:58:31.08
そんなバカみたいにバカいわんでもバカじゃあるまいし そんなにひとをバカにしちゃいかんで、 バカだ星のバカ大学のバカ学長のバカ息子のバカ友達に掘られるよ。
VisualStudioに可変テンプレートないとかなんなの? 舐めてんの?
>>861 gcc-4.6.1 でもまだ実装が不完全でイライラしてるくらいで
全く対応する気なしとか何を考えてるんだと
イラネー機能のせいにしてコーディングしないタイプ
C++ならラベル追加すれば素直にgotoできるし、 goto caseより読みやすくできると思うぞ
そうか? 感性の違いだな
例えばcaseが複数並んでる所に飛ぶ場合、 どれか1個だけ抽出してgoto caseするより ラベルにした方が意味が分かりやすいっしょ?
複数並んでたら、そうだな。 でも1個の場合は goto case の方が良い。
あと、なぜ別のcaseに飛ぶのか、という理由は、 単に処理が同じだからであって、そのcaseの値に特別な意味があるわけでもない gotoならcase以外に飛んで2つ以上のcase共通の後処理を素直に行う事もできるし、 caseに飛ぶよりは意味合いが分かりやすくなると思われ
確かにその通りだけどグヌヌ そこまでキッチリしにゃきゃならんの? 日曜マには分からん。
872 :
デフォルトの名無しさん :2011/09/19(月) 19:01:27.61
>>870 それダイクストラがやめろっていってたことじゃないのか?
スイッチのネストで解決出来ない?
switchのネストとかさらっと恐ろしいこと言うのやめて
二回も条件判定が出ると、修正ミスが起こりそうなのがね まあ俺もこんなgoto使った事ないけど goto caseよりはマシだな
ダイクストラの言う事が全てではないな 基本は複数のcaseで使われる処理を別関数化すると思うけど あまりに冗長になるならgotoの方が綺麗に書けると思われ
そういう問題じゃないよ switchは絶対にネストしてはいけない void hoge(int x, int y){ switch(x){ case 0: switch(y){ case 0: puts("あ");break; case 1: puts("い");break; default: puts("う");break; } break; case -1: puts("え");break; default: puts("お");break; } } hoge(0,0);hoge(0,1);hoge(0,2);hoge(-1,0);hoge(1,1); と呼ぶとどうなる? 答えはメール欄
あいうえおって表示されるけど・・・
あいうえおだな
うん、あいうえおだ
C++規格化前の大昔か、あるいは規格化前のCだと そういう時期もあったのかもしれないけど、 少なくともC++98にはこう書かれてる 6.4.2 The switch statement 4 Switch statements can be nested; a case or default label is associated with the smallest switch enclosing it.
4スイッチの文は入れ子にすることができます。caseまたはdefaultラベルは、それを囲む最小のスイッチに関連付けられています。
>>876 「コンパイラのバグだ!」
他「いや、お前のバグだろ」
よくあるこれ。
まあ大昔そういう時期があって そのまま覚えてるだけかもしれないから そろそろ許してやろうぜ
あいうえおワラタ
>>885 組み込み系か昔のコンパイラあたりでハマるケースがあったのかも知れないね
case -1:ってのが何かのポイントのような気がするが、解説もないし真相は闇の中か・・・
888 :
デフォルトの名無しさん :2011/09/19(月) 21:07:55.57
>>870 これでええんとちゃう。
switch(x)
{
cace 1:break;
cace 2:break;
cace 3:break;
}
switch(x)
{
cace 1:
cace 2:
//共通処理
}
890 :
デフォルトの名無しさん :2011/09/19(月) 21:45:40.84
いやこれで、直し忘れって gotoの方が忘れるだろ
case追加するだけでいい場合、 片方にだけcase追加して満足する場合があるんだよな、これが
そもそも最近switchとかあんま使わないけどな
caseはただのラベルだから、switchの入れ子はスコープ無視して 外のswitchからボコボコ飛んで来て滅茶苦茶になるからダメって教わってきたんだけど 最近は大丈夫なんだな VC2010だと確かにあいうえおだわ VC6やGCC3の頃はスコープ無視して最初のラベルに飛ぶようになってたはず
switch以外の場合はスコープ無視するけど switchだけは無視しないぞ
昔のコンパイラはswitchのスコープも無視してたんだよ 現にそれで痛い目にあった事があったからこんな事書いてるわけで 今は規格も実装もちゃんとネスト出来るようになってるらしいからいいです 昔話で混乱させてすみませんでした
VC6の頃もそうだっけかな・・・ あの頃はまだ規格ができたばかりの時期だったし 準拠率ひどいもんだったのであり得るとは思うけど、 C89だとそこんとこどうなんだろう?
897 :
デフォルトの名無しさん :2011/09/19(月) 22:35:12.62
>>891 意図して共通処理実行させるのに忘れる理由が解らん。
むしろ共通処理へのcaceを書いてないときは、
共通処理が実行されないことを望むだろ。
>>897 コピペや置換にミスはつきものなんだよ
理屈じゃない
人間は優秀だとしても100%正確に何かをできるとは限らないのだ
そのとおり計算上ほぼ百%安全だったはずの原発もポポポポーンしてしまうものなのだ
あれは計算の方を弄って100%を装ってただけだろーがw一緒にスンナ?
> 外のswitchからボコボコ飛んで来て滅茶苦茶になるからダメって教わってきたんだけど 上司に恵まれなかったんだな バグが原因なのに、言語のせいにする上司 可哀想に (笑)
C89でもswitchは普通にネストできるね VC6でネストできないってのは流石にないんじゃないの? 時代的に
903 :
デフォルトの名無しさん :2011/09/19(月) 23:10:30.06
あいううい になるコンパイラが特定されるまでは
>>876 の間違い。そんなふうになるコンパイラはないってことで、
スレは進みます。
906 :
デフォルトの名無しさん :2011/09/19(月) 23:26:46.56
印象もくそも入り組むし事実だと思うけど。
907 :
デフォルトの名無しさん :2011/09/19(月) 23:29:00.50
>>905 試しにgoto cace とやらを書いてみて。
gotoの例ってこんな感じでいいか? switch (key) { case VK_LEFT: x--; goto RING_Y; case VK_RIGHT: x++; goto RING_Y; RING_Y: x = (x + width) % width; break; case VK_UP: y--; goto RING_Y; case VK_DOWN: y++; goto RING_Y; RING_Y: y = (y + height) % height; break; }
1つ目YじゃなくてXだよ ミスったよ まさにコピペの罠
Cっていうか、かなり足りないC言語ではswitchネストしてbreakすると 一番外まで抜けてしまうコードを吐くこともあるコンパイラには出会ったことあるな MPLABのPIC用のコンパイラだけどさ
酷いとしか言いようがない
そこまで酷いコンパイラになると もう規格だの実装だの言うレベルにすら達してないな
913 :
デフォルトの名無しさん :2011/09/20(火) 00:15:56.98
template <typename T, typename U, template <class...> class C> C<U> map(function<U(T)> f, const C<T>& xs) { C<U> ret; transform(xs.cbegin(),xs.cend(),back_inserter(ret),f); return move(ret); } これ、 map<int,int>([](int x){return x+1;},xs) って呼んであげないとコンパイル通らないのですが、何とかなりませんか? マクロ使えば一瞬なのに・・・
lambdaはfunctionじゃないからUは推測できない function<U(T)>じゃなくて直接Lとかにして その戻り値の型を取得するといいよ
どう書きたいんだ。 <int, int>を無くしたいの?
916 :
913 :2011/09/20(火) 00:37:33.05
>>914 template <class f_type, ...>
typename function<f_type>::result_type map(...
だと、
map<int(int)>(...)
ってかんじに呼び出せることは確認しました。
lambda全体をLにしたとき、L::argument_typeとかって定義されてます?
>>915 そうです。
917 :
913 :2011/09/20(火) 01:03:26.85
返信遅れましたが、いけました。 イテレータ渡すときもそうですけど、型の情報がコードの見た目に反映されなくて嫌いです。 functionは記法としていいなぁ、と思ってたんですけどね・・・。 ところでmoveの使い方ってあってます?書かなくてもよかったりして。
918 :
913 :2011/09/20(火) 01:06:58.96
いけてなかった・・・orz map(negate<int>(),xs) はいいけど、 map([](int x){return -x;},xs) は no matching function for call to 'map(main()::<lambda(int)>,std::vector<int>&)' のエラーになります。
これでどうよ template <typename L, typename T> auto map(L f, const std::vector<T>& xs) -> std::vector<decltype(f(std::declval<T>()))> { std::vector<decltype(f(std::declval<T>()))> ret; std::transform(xs.cbegin(),xs.cend(),std::back_inserter(ret),f); return std::move(ret); }
機能的に妥当な名前だけどmapはやめとこうよ。STLのコンテナとまぎらわしいぞ template<class F, class T, template<class ...> class C> auto func(F f, const C<T> & c) -> C<decltype(f(*c.cbegin()))> { C<decltype(f(*c.cbegin()))> ret; transform(c.cbegin(), c.cend(), back_inserter(ret), f); return ret; }
そのための名前空間じゃないの
922 :
デフォルトの名無しさん :2011/09/20(火) 10:24:17.60
名前空間をなんでテンプレの引数にとれないのかな クラスで代用しろってことなんかな。 広域関数入れ換えられないからたまに欲しくなる。
可変テンプレート使えないコンパイラでもBoost.Egg(ただしReject)が代用できる
気になって仕方が無いのでscope(exit)ぽいのも書いてみた #define do_scpexit(a) {typedef int dmy_t_##a;int sx_cntr_##a=0; #define sbreak(a) {++sx_cntr_##a;goto label_sx_##a;} #define scpexit_pp(a) label_sx_##a:;for(int sx_i=++sx_cntr_##a;sx_i>=0;--sx_i){{; #define exit_case(a) }if(sx_i>=a){ #define close_scpexit(a) }}typedef dmy_t_##a dmy;} do_scpexit(x){ sbreak(x); sbreak(x); scpexit_pp(x){ exit_case(2){} exit_case(1){} exit_case(0){} } }close_scpexit(x)
キモイヨー
926 :
デフォルトの名無しさん :2011/09/20(火) 20:03:25.53
927 :
デフォルトの名無しさん :2011/09/20(火) 21:56:55.07
もう、基地外コードやめてくれる? そんなの、お前ら密教仲間で使っとけ
>>919 ,920
ありがとうございます。これで解決してますが、やっぱ
decltypeは嫌いですねぇ。typeofに逆戻りしてる感じが。
そもそもこのmapって効率悪いけどその場で書くことを目的としていたので、
どうせゴタゴタするならproxyつくるほうに注力するかな・・・。
->の前にusingでも書きたくなる template <typename L, typename T> auto map(L f, const std::vector<T>& xs) using U = decltype(f(std::declval<T>())) -> std::vector<U> { std::vector<U> ret; std::transform(xs.cbegin(),xs.cend(),std::back_inserter(ret),f); return std::move(ret); } こういう事できたらいいんだが (まあそれでもキモさにそこまで変わりはない気もするが)
なんでC++な人はLispじゃなくてHaskellに流れてくんだろ OCamlならまだわかるんだけど
Lispなんてゴミ今さらやるかよw
それなりに経験のある人なら、Lisp はもうやったからじゃないの。
C++な人でLispやっている人見かけないけどな 話題にすらならない
やはり型がないとやる気が起きない
Lispの話なんかして Lisperに絡まれたら嫌だし
Lisperって面白いことやっている人いないよね 態度はでかいんだけど
937 :
デフォルトの名無しさん :2011/09/21(水) 22:15:35.67
template <typename T1, typename T2, template <class...> class C> const pair<C<T1>,C<T2>> zip(const C<T1>& xs, const C<T2>& ys) { return move(make_pair(xs,ys)); //just want to pass } C<U> map(BFunc f, const pair<C<T1>,C<T2>>& zs);
naiveにzip書いてみたのですが、 returnするとき、コピーコンストラクタが呼び出されてる気がします。 なんかうまい手はあります? (ref(...)とか、使い方しらないので0xのrval_refでそういうのあったりするのかなーとか) ちなみにpair<const C<T1>&, const C<T2>&>を返すとセグフォだったので諦めました。
戻り値にmoveはいらないだろ あと、それzipじゃなくてただのmake_pairじゃん
>>929 template<class F, class T, class A, template<class, class> class C,
class U = decltype(declval<F>()(declval<T>()))>
C<U, A> func(F f, const C<T, A> & c)
{
C<U, A> ret;
transform(c.cbegin(), c.cend(), back_inserter(ret), f);
return ret;
}
>>940 完璧です。ありがとうございます。
map(f,zip(xs,ys))も、多重定義でmap(f,xs,ys)にしとくことにしました。
どうせこのパターンでしか使わないだろうし。
あとはreduceか・・・クロージャは素直に渡せるだろうか。
第一引数はconst F&にすればいいのか?
そのうちロベールさんがいい本を出してくれるさ
言い訳を重ねて逃げるってのはニートの特徴だわな
ただの愚痴だろ。たまに俺も自分のやってることに自信が無くなる。 無心にやり遂げちゃって決着ついた後なら案外成功でも失敗でも気にならんもんだけど。
946 :
デフォルトの名無しさん :2011/09/22(木) 09:51:37.93
>>930 そりゃ特殊化と同じ事できるからじやね。
あと俺はたまにlisp使う。
>>946 なんとなくわかった
ちなみに自分は数式処理がどうしても必要なんでlispからは離れられない
>>933 OpenC++でMOPとか
template駆使してLisp処理系モドキとか、
結構いるんじゃないの。
Boost-dev MLでもSchemeの例あげる人いるし。
>>946 特殊化はCLOSでもできるし、
むしろあっちが最近の特殊化の流れの大元だけど、
まあもはや流行りじゃないんでしょうねえ。
autoキーワード使いまくるのは良くないのかな? たとえばintのところも全部autoにしてるんだけど
intなのかstd::size_tなのかstd::ptrdiff_tなのか ぱっと見はっきりしてるんならいいんじゃない?
952 :
デフォルトの名無しさん :2011/09/22(木) 12:38:03.44
>>950 それがだめじゃスクリプト言語もダメって事になるだろ。
スクリプト言語はダメだろw
954 :
デフォルトの名無しさん :2011/09/22(木) 12:58:42.36
OO的側面からみたら宣言型を明示しなくてよいならそれに越したことはない。 smalltalkだってsimulaの派生なのに宣言型はもってないしね 。 OOらしく依存性を下げたければ出来る限り宣言型でなく オブジェクト自身の型に委ねるべきだ。 まあそれ以前に11規格は今すぐ使っていいものではないけど。
functionとかautoを使わないで「引数がAで返り値がRになるラムダ式」っていう型は作れないの?
作れない
957 :
デフォルトの名無しさん :2011/09/22(木) 14:49:40.47
テンプレ使えば作れますん
958 :
デフォルトの名無しさん :2011/09/22(木) 22:34:06.11
GCC4.6で template <int n, int...ns> struct sum { static const int value = sum<ns>::value; } ってやると「まだ実装されてない」っておこられるけど、 これって仕様としてはアリなのですか?
明らかに n+sum<ns>::value だった。すみません。
n+sum<ns...>::value じゃないの まあ未実装みたいだけど
main.cpp:9:40: 残念ですが未実装です: cannot expand ‘ns ...’ into a fixed-length argument list 切ない
「残念ですが」の余計な一言がイラッとさせる
ぷぷっ、未実装ですよJKwwww
964 :
デフォルトの名無しさん :2011/09/23(金) 01:21:12.88
>>950 リテラルで初期化するところは全部autoにしちゃってるな
それてfloat/double、short/int/longの適用次第計算中の精度が落ちたりする弊害出たりするんじゃね?
main.cpp:9:40: どうして実装してると思ってしまったのかな?ちょっとびっくりしました(笑): cannot expand ‘ns ...’ into a fixed-length argument list
リテラルが何の型になるかって環境依存だから autoにしない方がいいと思うけど
整数リテラルは、ね
autoはコードの可読性が下がるので明示しろ派との宗教戦争が勃発すると予言しておこう
そのうちautoはラムダとイテレータだけに使っとけよみたいな案がでます
973 :
デフォルトの名無しさん :2011/09/23(金) 12:47:55.90
auto a = -2147483648 * 1; auto main() { }
C++0xの追加要素のせいで過去のコードがバグるっていう可能性はありますか?
理屈の上では可能性はあるけど現実的には実際に使われてるC++98/03準拠のコードがC++11で動作が変わるということはほぼありえない。 もっともコンパイラのC++11対応(=バージョンアップ)の結果、古いバージョンでの独自拡張や規格違反だった仕様が変更されて それに依存していたコードの動作が変わる可能性ならばそれなりにある。
一番でかいのは文字列リテラルからconst除去したポインターに変換できなくなったことだろ。 Cに毛の生えた程度の糞コードは軒並みエラーになるだろ。
専ブラ使ってると、ついついコテハン記録機能がorz
>>976 実際には、あんまり派生言語対応とか考えられてないCライブラリのヘッダーが使えなくなって、
やむをえずコンパイラの互換性オプションを変更するはめに……ってなりそうだけどな
コンパイルできなくなるのはたいした問題ではなくあるいは逆に喜ぶべきことであったりする。 もし修正なしにコンパイルはできるが動作が変わることがあったりしたら地獄を見る。
03のstringでコンパイルしたobjファイルを0xでつかおうとすると死ぬ?
次スレC++11でよろしくな
983 :
デフォルトの名無しさん :2011/09/23(金) 18:26:33.36
ところで、あんた達、このC++11の仕様を仕事に使う気(というか、もう勇気) あるん? まったく、くだらん。せいぜいマスターベーションでもしてろ、馬鹿がw
>>980 03でコンパイルしたobjと0xでコンパイルしたobjで使用してるstringの実装が異なっているときに
03objで生成したstringを0xobjで受け取って使ったりその逆をやったりすればしねるかもしれない。
>>983 下っ端の教育とかまで考えるとちょっと踏み込む勇気いるよね
右辺値参照はSTLに組み込まれて速くなるだけでいいや ラムダ式は多用すると思う、ってかgccでは既に多用してる
使い勝手悪かったalgorithmさんが これで活躍してくれるかも
range版algorithmとrange adaptorが来るまでは標準のalgorithmは使う気にはなれない
まだないんだっけ? コンセプトさんがいないせいなのか
下っ端はライブラリ作らないんだからむしろautoとラムダだけ教えればいいわけで楽勝なんでは
下っ端がどうとか底辺の話はマ板でやってくれ
うめるか
>>990 ライブラリ的にはスレッドサポートが大きいと思うけど
atomicは楽勝なのだろうか
994 :
デフォルトの名無しさん :2011/09/24(土) 03:28:37.10
ウリもラムダ式は使いたいニダ
うめとくか
うめる
うめてんてー
C++998
C++999
C++1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。