KISS
kill internal secret scope
次の C の規格が決まるのは 2012 年らしいけど、次の C++ は 0x12 年かあ、大分先だな
Cはもう新しい機能組み込まなくて良いよ。 どうせ対応しないんだから…
脳が硬直化したゴミおっさんは変化を嫌うからね。
C++はどんどん新しい機能を組み込んで良いよ。 どうせ対応しないんだから…
>>7 VC以外は大抵C99に(十分実用的なレベルで)対応してるから、
C1Xも多分対応するよ。
VC以外はって、gccとclangぐらいじゃね? bccもdmcもopenwatcomも、和製CPU向けの組込みコンパイラも、複素数や複合リテラルなんて使えないはず……
12 :
デフォルトの名無しさん :2011/02/24(木) 10:42:17.18
>>7 マイナーチェンジはともかく
メジャーチェンジでは削除もすべきだな
とりあえずCは配列を値型として返せるようになるべきと思うんだ。 C++のstd::arrayとか無視して。
intelのiccを忘れてやるなよ。 あとbccはともかく、bmcは複合リテラルも複素数も使えるし、 WatcomCも undocumented feature という断りはあるものの C99実装が入ってるよ。
bmcってなんだよ。dmcと間違えた。
C99も10年以上経っているのに いつまでもコンパイラが枯れないね
>>16 何そのFUD?
コンパイラがC99完全準拠してないことを
枯れてないというなら、
C++はもっと枯れてないぞ。
枯れないというより周りの対応がいまいちかな gslとかいつ_Complex対応するの? ってやつ まあでもC++も時間かけてここまできたんだしこれからじゃないの
C99対応って言うとC++が例にあがるけど、Objective-Cって、 どの程度C99に対応してるのかな…?
>>9 投げやりな事言うなよw
Boostという強い味方がいるし
>>19 言語仕様としてはObjective-CはC99の(そしてC89とも)完全上位互換だよ。
コンパイラとしては、gccが対応している程度には対応してる。
>>22 で、そのObjective-CにはQtに相当するライブラリはあるの?
>>23 そりゃCocoaだろ。
Apple関係でしか使えないけど、
逆にそれ以外じゃObjective-Cなんて使わん。
Cocoaって言うか、iPhoneとか、iPadのコンソールアプリって作れるの?
なぜ作れないと思ったのか。
興味なかったから コンソールアプリ作ると、あの画面上に、つらつらと文字が表示されるのか?
へぇ〜 iPadだったら問題なく使えそうだね iPhoneだと、画面が小さいから工夫が必要だな…
作ったところで審査通るわけないだろw
自分で作ったアプリも審査通さないと、自分の実機で実行できないのか?
んな訳ないじゃん。つーかスレチ。余所でやれ
ラムダとか独自構文作ってないでBlocksを取り入れろよなー マイナー言語の癖に
むしろあの腐ったリンゴは何でBlocksなんか作ったんだよ……
Grand Central Dispatch のためだよ。
規格策定始めた頃は今の状況が予想できなかったんだろうなぁ ラムダなんか捨ててBlocksを使うように考え直した方がいいよ 今からでも遅くない
見てきたがきめぇな 変態ってレベルじゃねーぞ
そりゃスッキリしていたら 0x 年の内に完成しただろうさ・・・
関数ポインタの * を ^ にしただけジャン。
^の使い方がC++/CLIと被るのが若干気持ち悪いな。文法そのものはCの自然な拡張ならあんなもんじゃない?
typedefで定義した型名でもオーバーロード出来れば便利だと思うときない?
こんなか? typedef int (*f)(int) | float (*f)(float); int a(int x) { return x + 1; } // 1 float a(float x) { return x + 1.0; } // 2 f p = a; p(10); // call 1 p(5.5); // call 2 実装は関数ポインタの組でいけそうだが、欲しいところが思いつかない。 ……とここまで書いて気がついたが、単にstrong typedefが欲しいって話か(汗
strong typedefってのが良く分からんけど、こんな感じ #include <iostream> typedef int mint; void foo( int i ) { std::cout << "foo( int ): " << i << std::endl; } void foo( mint m ) { std::cout << "foo( hoge ): " << m << std:: endl; } void bar( int i ) { std::cout << "bar( int ): " << i << std:: endl; } int main() { int i = 5; mint m = 10; foo(i); // void foo( int )を実行 foo(m); // void foo( mint )が定義されているのでvoid foo( mint )を実行 bar(i); // void bar( int )を実行 bar(m); // void bar( mint )が定義されてないのでプリミティブなvoid bar( int )を実行 return 0; }
void baz( mint m ) { std::cout << "baz( mint ): " << m << std:: endl; } baz(i) は?
>>44 明示的にキャストしないとコンパイルエラー
イメージとしては継承みたいな感じで
自分から一番近い継承元へ暗黙的に継承されるが、
継承先へはキャストされない
まぁ、今までのコードが通らなくなるから、typedefって名前じゃなくても良いけど…
Blocksは変数キャプチャの管理がおぞましすぎて 匿名関数として使うならともかくラムダとしては無いわ 場当たり仕事で言語作ってんじゃねえよ Blocksを見てから戻ってくるとラムダさんの珍奇な服が合理的に見えるから不思議だ
暗黙的に継承って、おれアホだ…orz >自分から一番近い継承元へ暗黙的に継承されるが、 自分から一番近い継承元へ暗黙的にキャストされるが、
>>40 `^' で、返り値を指定するのは、smalltalk 由来。
(「Objective-C だし、たぶん、そうでしょう。」ぐらいの確かさだけど。)
^はそんなに気にならないな むしろ__blockとかBlock_copyとかに吐きそうになる
>>43 それをstrong typedefという。初期D言語にあったが今は撤廃されてるはず。あとAdaにもある。
ところで、int f(int)にmintを渡した場合、返値の型はどうなる?
>>50 int f( mint, int )とかの場合、判断できないからintが戻る
そう考えるとint型に対してmint()への暗黙的変換のルールがないと
関数呼んだ時に、毎回キャストが必要なのは不便だな…
operator int::mint() const { return (mint)( *this ); }
クラスじゃないのにint::mint()とかthisとかキモい…orz
それならint::operator mint()じゃないの?
>>51 例えばAdaなら、intからmintを作った時点でint f(int)があれば、mint f(mint)もできる、
int f(mint, int)みたいなのはmint定義後でしか作れないから、こっちは常に定義通りintが返る、
みたいなルールがある。
あと暗黙の変換があると逆に微妙じゃね?
あって嬉しいのは整数リテラル→mintぐらいじゃ?
>>54 >例えばAdaなら、intからmintを作った時点でint f(int)があれば、mint f(mint)もできる、
それが出来るなら、そっちの方が良いけど、実装を考えると大変じゃない?
例えば、標準ライブラリとどうやってリンクさせるかとか…
って中間ファイルを作れば良いのか…?
>>55 リンクって……実体はひとつしか無いんだから。どっちもアドレスとると同じ関数だよ。
でもC++だとマングリングがあるから微妙かもな。
>>56 >でもC++だとマングリングがあるから微妙かもな。
そのためにリンク用の中間ファイルを作ればいけるのかって話
単純にコンパイラ的には中身空っぽの継承を一発宣言出来る記法があればいいんじゃないの あとint f(int)とmint f(mint)が両方欲しいならtemplate使えがC++流だと思う
>>58 それは違う。
具体的用途としてはintからwidth型を作って、weight型との混同を防いだり
cout <<で専用の出力を用意したりになると思うので、
absのような汎用int向け関数はそのまま使いたいはず。
>>59 だからwidth型をint型の派生型として扱うような何らかの文法を用意すればいいんじゃないの?
abs(int i)はabs(width i)を用意しなければ暗黙キャストじゃん
>>58 現在あるプリミティブな型を全てクラス扱いにすればその通りになるが、
実装を考えると、なかなか厳しい。
標準ライブラリを切り捨てれば出来そうでもあるけど…
>>61 いやもちろん実際にクラスとして扱えって言ってるんじゃなくて、
strong typedef構文を作って論理的にコンパイラ上で継承っぽく扱うだけでよくね、って話な
manglingの互換性についてはstrong typedefのある世界から無い世界のライブラリを呼ぶ分には上位互換が保てるはずだし逆は有りえない
>>62 単純に上位互換は難しい気がする。
extern "primitive"
とかにすれば、ほぼ問題はないと思うけど、やりたくないでしょ?
>>60 引数はいいけど返値どうするのよ。毎回ダウンキャストする羽目になるぞ。
>>64 templateで解決って方向じゃダメ?
Dでstrong typedefが無くなった理由は何なの?
コンセプトが復活するまで無くしちまえという案はないのか
まあ案4でいいんじゃないの?
begin/endの外部関数を作るくらいなら
アダプタクラス作ったのでも手間は大差ないし、
ADLは俺もキモいと思う。
まあそもそもbegin/endメンバ関数が特別扱いになる時点でキモいけど。
range-based for 用として使えないようにする指定も必要ではないのだろうか?
>>68 いっその事コンセプトを復活させてしまおうという案はないのか
コンセプトまでrange-based forやらないのならもう0xはrange-based for無しでやれよw
for_eachを利用する側の責任でbegin、endが銅のこうの言う事自体おかしいと思うんだ
1.コンテナの先頭アドレスを返す特別な演算子 beginof を作る。 2.コンテナの終端アドレスを返す特別な演算子 endof を作る。 3.要素列の次の要素のアドレスを返す特別な演算子 nextof を作る。 4.上記3つの演算子をユーザー定義可能にする。 5.beginof, endof, nextof の3つの演算子が定義されているオブジェクトは range-based for に渡せるものとする^^ Container Obj; for ( beginof Obj; endof Obj; nextof Obj ) { ... のような記述もあり^^
おもしろ言語になっちゃうな。
どんな変なことになってもAda2012の同機能の提案よりはマシに思える俺ガイル。 案1) begin/endに相当する関数を、型宣言と一緒に変態構文で書かせる……。 type T is (型宣言) with Variable_Indexing => (関数名), Default_Iterator => (関数名), 以下同様; 案2) begin/end相当のメンバ関数を持った特殊なクラスを継承させる……。 どっちも後付け不可能な上にキモいことこの上ない。 そもそもforeachのはしりのVBやらC#とかだってIEnumeratable継承してるわけだから 後付け可能な方向で進められてるだけC++は幸せと思うべき。 ADLでもなんでもそれに使える機能がある時点で恵まれてるじゃないか……。
range_traitsを使う案2が好み まあコンセプトなしならrange-based forやめろとか 間に合わせの為にADL使うのはまじでやめろとかは思う
何がC++をこうしたんだろうな。templateの導入が分水嶺だったか。
案4はforを書くたびにAdaptorでラップしなきゃいけないのか? かなり面倒だな。せっかくfor文が短くなるんだからAdaptorなんてタイプしたくない。 traits案で何とかしてほしい。
traitsを採用してしまうと、将来、TR2とかで、Rangeという一般的な概念をライブラリに持ち込む際、 既存のコードをどう取り込むかという問題に直面する。
変なルールを持ち込むとC99みたいな運命になるしな^^
その前に完成しないとな^^
これ以上ごちゃごちゃするなら、C++は最低限の修正に抑えて、 Cとの互換性に重きをおいて、追加したい規格は別物にしてしまえと思う。
conceptがないならいらないかな 正直range-based forについてあれこれ議論する時間があるならconceptにあててほしい
renge-based for で enum 使えるようにしておくれ
85 :
デフォルトの名無しさん :2011/02/28(月) 23:09:50.15
C++がどこへ行こうとしているのか正直良くわからん。
>>79 range-based for に traits を採用したとしても
将来的に concept が復活したら
iterator_traits や type_traits と一緒に
deprecated になるのでは
全く関係ないbegin, endを持ったクラスで誤爆しないためにも、
>>73 が一番いいよな。
contextual keywordをもう取り入れちゃったんだから怖いもんないよな operator begin()とか作ったっていい訳だ
traits方式が一番安全だと思う
後から簡単に脱着できる点ではtraits方式がいいかなー。
ttp://codepad.org/wxbJmLE7 暇だからrange_traitsを自作してみた。この系統の案が最適だと思ったからね。
でも根本的に勘違いしてることがあるかもしれないのでツッコミ募集。
で、作ってから本の虫の人のページに行ったら、その系統では何か似たようなこと書いてあって不思議な気持ちになった。
しかし、色々本の虫の人のページのやつから見て劣化してるから、すごい悲しいです。
だれかフォークしてもっといい感じにしてくれんかね。お願いプリーズ。
そうそう。コードパッドってC++0x対応してないのね。 VCで部分的にできてるから、ちょっと甘く見てた。
ideone.com使えばいいじゃん
>>92 根本的に間違っている。
traitsってのはオブジェクトとして使うことを想定してない。
動的なポリモーフィズムではなく、テンプレートによる静的なポリモーフィズムを利用する。
だから、begin/endは、staticメンバー関数になる。
まあ、簡易的な実装としてはこんな感じ
http://ideone.com/sHUiZ
range-based forは見送りでいいよ。大して便利そうじゃないし。 変な仕様入れるのだけは避けて欲しい。
ですよね。 集合をコンパイル時に把握出来る場合は条件分岐を完全に消してくれるとか 最低でもSIMD化してくれるとかその位言語機能に密着したforeachなら欲しいけど
98 :
92 :2011/03/01(火) 15:35:15.94
>>94 今度実験してみますー。
>>95 指摘感謝。そういうルールは知らなかった。勉強になるよ。
個人的にはC#のIEnumerator的な感じのものを考えてたんだけど、ハズレだったか。
とはいえ、俺、C#はC++よりも素人なんだけどね。
いやー、大変勉強になったよ。これで、引っ込みます〜。
現状(C++03)でもBOOST_FOREACH無しじゃ面倒でやってられないよ。 正直どんな形でもいいからrange-based forは入って欲しいね。
std::for_eachとラムダで現状不便を感じない 変な物は入れないで欲しい どうせ後で邪悪な負の遺産になるんだから
>>67 0 comments なんでポストしてみたけど捨てられたお(´・ω・`)
まあいいや
手動でOpenするようになってんじゃ?
103 :
デフォルトの名無しさん :2011/03/02(水) 03:08:03.18
http://www.open-std.org/jtc1/sc22/wg21/ News 2011-02-28: The deadline for the next mailing is 2011-04-08
News 2011-02-28: The 2011-02 pre-Madrid mailing is available (9000 kB tar.gz, .zip 9000 kB)
News 2011-02-28: The C++ Standard Core Language Issues List (Revision 75) is available
News 2011-02-28: The C++ Standard Library Issues List (Revision 74) is available
最新ドラフトは N3242
変更少ねえwwwww そろそろ大詰めだな
range-based for の話は n3257 か
テンプレートマラメータ
>>108 typeid().name()は環境依存だろ
保証されているのは同じ名前は同じ型を示す事のみ
いや、そういう話ではなく、VC++ではどちらも obj_ がint 型となってしまうって話。 JIS X3014 プログラム言語C++ p.213 7 クラステンプレート又はクラステンプレートのメンバの定義の中では, 《テンプレート仮引数》(14.6.2)に従属しない基底クラスのなめのそれぞれに対して, その基底クラスの名前又はその規定クラスのメンバの名前が《テンプレート仮引数》(14.6.2)と同じ場合, その規定クラスの名前又はそのメンバの名前は,《テンプレート仮引数》の名前を隠す(3.3.7参照) p.214 3 クラステンプレート又はクラステンプレートのメンバの定義の中で, そのクラステンプレートの基底クラスが《テンプレート仮引数》に従属する場合, 修飾されていない名前の検索では,その基底クラスの有効範囲は, クラステンプレート又はメンバの定義においても, クラステンプレート又はメンバの具象化においても,対象とならない。 明確な規格違反。まぁ、VCはもともとテンプレートがまともに動かないことが周知されてるんでいいんだけど。
>>111 内部バージョンいくつ? うちでは
int
int
と表示されてしまう…orz
VC++2010 Express 32bit版
10.0.30319.1 RTMRel
Expressだからダメなのか!(・_☆)
>>112 規格違反(MSに言わせればLanguage extensionらしいが)を無効にするオプション、/Zaを使っていないんだろう。
おぃいぇー。やっぱりExpression版だからだめだったようだ↓
http://msdn.microsoft.com/ja-jp/library/0k0w269d (v=VS.100).aspx
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
・プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
・[C/C++] フォルダーをクリックします。 ←そんなフォルダはない
・[言語] プロパティ ページをクリックします。 ←そんなページはない
・[言語拡張を無効にする] プロパティを変更します。 ←そんなプロパティもない
コマンドラインから指定したらできた。
コマンドラインのヘルプには
-Za 拡張子を無効にします
拡張子ってなんだよ…
それから、-Za を指定した上で windows.h をインクルードしたらエラーが大量にw
連投ですまん。 いっぺんプロジェクトを保存したら出てきた。(?) ながながとスレよごしすまんかったよ。 忘れてくれ。
>>114 「拡張子」は extension を機械翻訳かなんかしたんだろう。
>>114 ちゃんとあるぞ。
そもそも正しくプロパティページを見ているかどうか疑問だな。
Windows.hは諦めろ。
いや、まあ無理だが。
int const * p; // コンストintへのポインタp int • const p; // intへのコンストポインタp int const * const p; // コンストintへのコンストポインタp const int * p; // コンストintへのポインタp な訳だが const int * p; // int const * const p; と同義の方が良いのではないか?
>>118 せっかく整合性が取れてるものに、わけわからんルールを追加するのはやめようぜ
const typedef int* p とか int cont typedef* p とかみたくストレージ指定子が混ざったらどうすんのさ
むしろconst intの語順を禁止しようぜ。 そうすれば全部逆から読めば済むようになる。
誰が既存のコードを修正するんだい?
ソースコードフォーマッタ通すだけだろ。#defineさえ無ければだけどな!
int long unsigned const long *oops;
>>118 同義だとなにがうれしいんだ?
ぱっと見const intの配列がイテレートできなくなる誰特仕様だと思うんだけど
>>108 うわっVC10だと本当に両方ともintになる
言語拡張は結構だが、MSDNに 言語拡張を有効にすると名前解決のルールが変更になる旨が書かれていないのが問題だ。 いや、C++の利用される世界は大部分がWindowsなんだから むしろISOがVC++の挙動について記載するべきで 標準規格はMS基準に準拠していないのですみませんと謝るべきか?
ほかにも、/Zaなしだと、ユーザー定義の型変換を二回、暗黙に適用したりするぞ。
井上まりなちゃんって学習院大学卒業のスーパーエリート貴族だから 超ドSらしいね^^
129 :
128 :2011/03/04(金) 01:47:45.34
すごい誤爆だよ\(^o^)/
\(^o^)/
突然声優スレに
ここはlispスレではありませんや
ここはC++のプロが集まっているところだと思うので、ちょっと質問させてください。 普段からpure C++(およびC++0x)しか使ってなくて、困ったことはないのですが、 C言語のほうが短く簡単に書けるようなことってたぶん結構あるんじゃないかと思うのです。 思いつくのを羅列してみると、 - I/O関係(printf,scanf,...) - マクロ - 配列初期化 - ポインタ演算 C++0xでかなり改善されているとはいえ(autoとか)、対応するコンパイラがマシンに入ってない場合も多いので、 ちょっとC言語も勉強してみようと思うのですが、みなさんが普段dirtyテクニックとしてCを混在させているものを教えてください。
マクロにしろ配列にしろポインタにしろ、別に全部C++でも同じように使えると思うが マクロはC++的にはなるべく排除したい方向だけどboostとかでは使いまくりだし好きにすればいいと思う printfの方が便利なのは同意
135 :
133 :2011/03/05(土) 12:05:47.74
ちょっと書き方がまずかったかな。 私の理解では (pure) C++の仕様には例えばprintfが含まれていないが、C/C++と考えるなら何でも使える。 えっと、C++0xの仕様にはprintf,scanfは含まれるんでしたっけ?
136 :
133 :2011/03/05(土) 12:16:31.99
あとCなら「愚直な書き方をして高速なプログラムになる」という一番大事な性質を忘れてた。 式テンプレートとか、その場では書けない・・・。 Cを別の言語でコード生成するとか、そっち方面の話。
C++自体がC含んでるのに何を・・・ あとCとC++の速度はそんなに変わらん
あんたらプロ(笑)なんだから答えられますよね?!w まで読んだ
C++の規格でCに全面的に依存してるのは<cxxx.h>系ヘッダの仕様だけだろ あとは大体一から機能書いてる(C参照してる所もなくはないけど一部)
x <cxxx.h>系 o <cxxx>系と<xxx.h>系
142 :
133 :2011/03/05(土) 12:54:55.47
>140,141 そうだったんですか! >138 そのスレ知りませんでした。行ってみます。 たいへんお騒がせしました。 ここにはこれ以上書き込みしません。
>>141 どうでもいいことだけどそのoxの書き方始めてみた
すぐ下を読んでやれよ
いやです!
iomanip とか本気で使ってる人いるんだろうかねえ > printfの方が便利なのは同意
148 :
デフォルトの名無しさん :2011/03/05(土) 20:15:17.27
正規表現が標準でついてないのは痛い。 0xの正規表現はエスケープが痛い。
\\\\
スレ違いの駄文はスルーの方向で。> ALL
ADLが嫌われてるわけがよくわかんね ADL無くてもオペレータオーバーロードを直観的に実装する事ができるの?
誰も嫌ってない。 ADLの必要性は誰もが認識している。 ただ現行の大き過ぎる影響を軽減したいだけ
Conceptがどっちの案に転ぶかも分からんから、 rangeのためにADLいじって、 将来conceptと整合性取れるのかどうか、全く不透明。 だから禿はADL改変は採用しないだろう。 Name lookupについてはかなり慎重だから。
ADLは実装によって解釈が違うことがあるしね…
>>153 いや、associated namespace採用直前だけど!
オペレータのオーバーロードが問題なら、オペレータだけ特別扱いしてくれればいいのに。 他の名前までADLしなくてもいい
ADLの仕様を形式言語で書き下しているのってないの? g++やCLangのソースを除いて。
>>148 そのための Raw String Literal じゃないのか
Raw String Literal はこの前無くす提案が出てなかったっけ
Raw String Literal ってそんなに実装に手間がかかるの? 単純にエスケープ文字を無視して扱っているって思っているのだけど
規格の文言通りにやると一度エスケープ処理した後で差し戻さないといけないからすげえ手間になる そうでない方法を取ろうとすると今度はコンパイルの手順自体が変わるから大改造になる 実装は極めて難しいよ
cppに取っては悪夢でしかない。 (phase 3で逆変換!)
>>153 むしろ禿はADLによるフォールバック推進派だったりする。
ただでさえ似たような機能が山ほどあるC++なのに、同じ機能ですら実現方法を複数用意するとかどうなのよ……
ラムダさんの悪口はやめるんだ
なら前置インクリメントは += 1 で代用できるから廃止で
演算子オーバーロードがあるからそう単純な話でもない
raw string を phase 3 で "revert" するって文面は消えたよ。 …と思ったら、Preprosessing token (2.5) に同じことが追記されてるね でも前よりは投げやりな書き方でなくなったと思う。
0xf年に間に合うの?
0x10でも別にいいじゃない
++をインクリメントと考えて0xfなら16ってことでOK?
++ がインクリメントだとして、C の次期規格は来年出る予定だよ C++ の 2000 年代は長そうだけど
Post incrementだから規格出た後で2010年代突入!
>>147 boost::formatの出力をユーザ定義するときに使った
C++0x10
規格が正式にいつ決まるかなんてどうでもいいや。 俺の欲しい機能は大方VCとgccにもう実装されているし。
当たり前かも知れんけど、ラムダに親から受けた任意のTを渡すことができるんだな。びっくりした。@VC10EE あ、よく考えれば無いとこまるのか・・・。 #include <stdio.h> template<class T,class F> T Function(const T& Val,const F& Proc){ return Proc(Val); } template<class T> T Proc(const T Val){ return Function(Val,[](const T& V){ return V*V;}); } int main(){ auto D = Proc(100); printf("%lf\n",D); return 0; }
親?
local lambda expressionの定義されているブロックスコープのinnermost enclosing functionのことを言いたいんだろ。 変な独自用語を作って欲しくはないけどな。
あー、独自用語になっちゃったのはすまない。 最近は親とか子とかいわないのか。ふむー。
いや最近とかじゃなくて、どんな比喩にしても親子関係なんかないからそれ
ネスト構造を木構造に見立てて「親子」ってのは割と普通の言い方だと思うんだが。
単なる関数呼び出しをネスト構造って言うかね
言うよ スタックツリーを頭に浮かべれば自然な言い方
いや全然
私のことで争うのはやめてー!
N3242でparentが出てくるのはthreadのとこ1回だけか
あー定義が入れ子になってるのを親子って言ってるのか 勘違いした
190 :
デフォルトの名無しさん :2011/03/21(月) 00:30:47.77
で、右辺値参照はどうなった? 禿げか、何とか委員会かしらんけど ゴチャゴチャ抜かしているとみんなC++そっぽ向くぞ! って、もう向いてるか。。。
行を空ける奴、キモイ
raw stringなんて必要か? 正規表現だろうが、ファイルパスだろうが 普通そんな文字列コードから追い出すだろ。 そんなもん作るぐらいなら、既存のstringメッセージの読み込みを 何とかしてほしい。 みんな、windowsのリソースファイルやらサードパーティー 使っててC++標準使ってんの皆無だぞ。 てか、C++標準のstring/locale回り使ってるやつ皆無じゃね。
まあ、入出力と文字列操作は分けるべきだよな。
必要な人がいてそれが認められたから入ったんだろ
>>192 稚拙な文章で何言っているのかわからん。
うまくm17nする枠組みがほしいってこと
>>195 枠が欲しいんじゃなくて、
ユーザーに見捨てられてるライブラリーを何とかしろってこと。
localeが使われないのは実装側にも問題があると思うけどな gccとか全く実装してないじゃん
「全く」は言いすぎだろw
>>197 POSIXはPosixで枠があるしWindowsは自分で枠持ってるし
Unicodeだってマッピングコンセンサス統一されてるわけじゃないし
実装できないのが現状だと思う
ググっても、メッセージカタログやら collate使ってるサンプルコードなんてゼロ。使ってる? いい加減unicordの具体的仕様に足突っ込みゃいいのに。
文字列とI/Oは専用スクリプトかなんか用意しC1xと足並み揃えて言語外へ出しちゃえよ
UnicodeってMS/NEC独自解釈で先走り(SJISの独自マッピング)とかが結構あるので プラットフォームがかわると互換性がひくいんだよね. べつにC++に限ったことじゃないけど
ゼロとか何を根拠に言っているの? というか調べたことすらないんでしょ。 Unicodeはまた別問題だし。
>>203 "collate" "C++" でくぐって見つかる
標準ライブラリーのcollateに関する記事は35件未満。
それ以外はSQLのcollateか英単語としてのcollate。
見つかった35件未満の記事でも、内容は単なるリファレンスとFAQだけ。
メッセージカタログは見つかったら省いたわけねw
>>205 口だけか、人にいう前にググれよ。
"message" "locale" "C++"
でググった場合3件がリファレンス。
他の結果はまったく関係なし。
>>203 マルチバイトに関する仕様が言語に含まれるか含まれないでは全然違うだろ。
最低限1つのunicodeをサポートされてたなら、
openにwchar_tが使えないとか、サロゲートペアがどうのとか
気にする必要がなくなる。
> 最低限1つのunicode 意味がわからん? Unicode て, 何種類もないだろ?
localeとか使わないな まともに実装されてない事もあるし
0xって仕様固まるの来年だっけか? んで、コンパイラが対応して新規格によるプログラミングが主流になるのに どのくらいの年月がかかると思う?
>>210 便利な機能は速い速度で普及するだろう。すでにラムダはいい感じで普及してると思う。
業務で使うことになったらって話なら、OSの転換期とか大きなブレークスルーがないと互換性の問題から逃げられん。
212 :
210 :2011/03/22(火) 19:57:59.36
なるほどね〜
>>208 文字集合とコードはひとつだった気がするが、
符号化方式は少なくとも3種あり、処理法が全然違う。
unicodeは荒れるからそっちのスレでやってくれ
>>210 VCが対応したら。
やっぱりWindowsで普通に大多数が
使えるようにならないと。
WindowsでVC++ってのも徐々に減ってくんじゃないか? C#辺りに流れて。C++人口はかなり減ると思う。
>>216 受託開発の場合、VC++の案件って既存システムの資産が
捨てられない案件しかないから、案件自体かなり減っている
ラムダ式は便利だねー。 っていうか、C++テンプレート完全ガイド読んで思ったけど ファンクタ使うのマンドクセ。
たまに「この場合は関数オブジェクトの方が便利だな」とか思っちゃうのは普通なのか飼い馴らされてるだけなのか……
自分は式テンプレートの活躍の場が少なくなるかと思うと寂しくて仕方ないです。
規格仕様の確認をさせてください。 1つのファイルの中で、非ローカルの オブジェクトが複数あった場合、その コンストラクタの実行順序は、記述された 順とかでなく、不定なんでしたっけ? 複数ファイル間で不定なのは把握 してるんですけど、さすがに1ファイルの 中では仕様が定めてないのでしょうか? できれば、規格の該当項目とあわせて 教えていただけると助かります。
ネームスペーススコープにあるものはコンパイル単位内では定義順だよ ソースは↓
3.6.2 Initialization of non-local variables
グローバルネームスペースでは不定と言う事?
グローバルネームスペースもネームスペーススコープです 参照 3.3.5 - Namespace scope
226 :
221 :2011/03/25(金) 21:08:59.20
>>222-223 どうもありがとうございます。
規格該当項目も確認できて、納得です。
やっぱりそうですよね。
そうでなければ逆にややこしそうでも
ありますし。
ただ、項目最後のほうの記述は、完全に
把握した自信がありませんが。orz
意味が
相互依存する定数を定義できなくなるからね。
g++で昔よく分からないバグが発生して、 結果、ヘッダAで定義されるconst定数(小数だったと思う)を使って ヘッダBで定義されるconst定数を初期化してたのだが、 どうもヘッダAの値が初期化される前に ヘッダAの値を使ってヘッダBの値が初期化されてる臭かった。 ヘッダなので翻訳単位をまたがるという類いの問題は起こらないと思うんだが、 単なるg++のバグだったんだろうか。 結局不本意ながらマクロにするしかなかった。
他の.cppでもインクルードしてたんじゃないの?
const定数は内部リンケージだから そういう話とは関係ないはず
>>231 そろそろ0xと呼ばなくてよくなりそうだね。
C++11になるかC++12になるかはまだわかんないけど…
finalって言ってるけど本当にこれで終わりなの?
>>233 文言の修正、追加はこれで終わりだけど、各国の委員会で蹴られる可能性がある
じゃあそろそろ反省会をしよう
投票とかするんだっけ? 蹴られたらどうなんの?
今後、各国支部(National Body)から、FDISに賛成するか反対するかという二択の投票がある。 もはや、NBコメントというのはない。全面的な賛成か反対かだけ。 各国一致で賛成でなければならない。 もし、一国でも反対した場合、規格の全面的な見直しが行われる。 その結果、規格制定が一年以上は、確実に延びる。
gdgdっぷりを見てるとすんなり通るとは思えないんだけど
そろそろ仕様読み込んでみようと思ったけど、 まだちょっと怖いのかなあ
俺的にはregexとラムダ式が入っていれば十分
今更反対はないな 文句あるなら最初から言ってるだろうし
C++0x が制定されたとして、 JIS 化されるのはいつ頃のことになるのかね? 拙者は英語がわからん人なので日本語の規格文書が必要でござる
無理に規格を読まなくても解説書籍は出る
本の虫さんの解説書を(出たら)買ってやれよ
何気なく JIS 見てたら冒頭に「制定すべきとの申出があり」って文があった。 これを「中出があり」と見間違えてけしからん奴だと思った。 なぁ、正直に言ってくれ。 お前らもこの見間違えしただろ!! したよな? な?
JIS 見てると Programming languages C++ って書いてあるけど、 なんで languages なの? language じゃ駄目なの?
Programming languages という区分の中の C++ ということではなくて?
>>244 サイト名 (ブログ名) で人を呼ぶのって古いスタイルな気がする。
まぁ、どうでもいいことだが。
そこはデフォルト名無しさんだろ
ナウなヤングにバカ受けな表現ですね
>>237 メンバー各国は賛成・反対・棄権の三択。承認のための条件は、
・全投票中、Pメンバー国の賛成票が2/3以上、
・全投票中、反対票が1/4以下、
この二つ。否決されたらプロジェクト自体が破棄されるので最初の投票からやり直し。
だからFDISまで来たら普通は成立させる。
最新のドラフトはN3242でいいのかな?
ユーザ定義リテラル最高!(AA略
今回はなしでも良かったけどな。
void c(int && a) int a; int b&& =a; c(a); の3行目と4行目がエラーになるんですけど おかしくないですか? &&はconst以外なんでも束縛するってよんだのですけど。
>>261 とりあえず3行目は文法エラーだよね?
実際のコードと使ったコンパイラとエラーメッセージと「よんだ」もののURLを正確に貼るといいよ。
void c(int && a) int a; int&& b =a; c(a); すみません許してください。 初歩的なミスで文法間違えました。 それでも駄目でしたよ。 move(a)にするとできましたよ。 TDMのGCCをつかいましたよ。 コマンドラインにも0xを使うやつをつけましたよ。
aは左辺値なんだから当たり前だろ c(b)なら通るだろうけど
bでも無理だわスマソ
なんでそこでaを右辺値だと勘違いするのかね
>>267 知りませんでした。
ということは完全転送ってやつはどうなったのか調べてみますね。
>>267 の完全転送は右辺値参照が左辺値もとるやり方で書いてありますね。
一関数で書く書き方はもう無理っぽいですね。
完全転送ってテンプレートの話でしょ?
テンプレートでやってみて出来なかったから intで実験しても出来なかったから質問したので テンプレートで出来ないのはとうぜんでしょ?
俺がやったのは template <typename T> void c(T&& a, const T& b){} って関数だけど完全転送と一緒だろ?
なんか聞きたいことがよく分かんないな……
>>273 完全か完全でないかはさておき
とりあえず転送しろよw
/.の記事は初めて見たけど完全転送に関しては十分に書かれてると思うけどな
とりあえずstd::forward使っていろいろ試してみれば?
std::forwardは関数テンプレート1つで書かれてるよ
もしかして完全転送のやつってテンプレートのインスタンス化の仕組みなのか?それなら 273のやつは違うエラーだな。
誰が誰だかわからねえ。質問者は名前欄になんかいれとけよ。
●テンプレートでは、T&& に左辺値を渡すとT&として扱われる↓ 14.8.2.1 3. もしP(テンプレートな仮引数型)が cv被修飾型ならば、 Pのトップレベル cv修飾子は無視して型推論を行う。 もしPが参照型ならば、Pに参照される型を使って型推論を行う。 もしPが cv修飾なしのテンプレートパラメータへの右辺値参照であって かつ実引数が lvalue ならば、 A(推論された型)の代わりに「A への左辺値参照」を使って型推論を行う。 ●テンプレートでなければ、T&& にテンポラリを渡せる↓ 13.3.3.1.4 3. 暗黙のオブジェクトパラメータ(メンバ関数のパラメータリストに 暗黙に追加されるthisのこと)以外では、 const& 以外の左辺値参照を rvalue に束縛したり、 右辺値参照を lvalue に束縛したりするような 標準変換を行ってはいけない。 (★訳註: それ以外の変換ならやってもいいということ) 俺様例: void f(double&& rr){} void g(int&& rr){} int main(){ int i = 0; f(i); // OK: (double)i は prvalue なので、変換後のテンポラリを束縛できる // g(i); //だめ } (8.5.3 第5段落の最後の例も参照)
278 :
277 :2011/04/12(火) 12:52:10.71
>>263 は a も b も lvalue だから (b は名前付き右辺値参照 = lvalue)
c(a) も c(b) も当然エラーになる。
279 :
質問者 :2011/04/12(火) 13:01:49.76
きのう帰ってから実験してみたけどわかったぞ。 template<typename T> c(T && a){} template<typename T> d(T &&a, const T& b){} int a, b; c(a); d(a , b); 上記のソースコードで7行目はエラーで6行目はエラーではなかった。 これはよそうだけど関数の引数のタイプがT&& aのときのみTが&Tに変わるっぽい だから7行目は左辺値のTを&&Tにバインドすることに新しく変わった右辺値のみバインドするルールで 駄目らしい。 例えばイテレーターでendは普遍だからconst T&に束縛したくてbegは別の変数にコピーしないで右辺値でも書き換え たいからT&&に束縛したときどうしたらいいですか?
>>279 template<typename T>
void d(T &&a, const typename std::remove_reference<T>::type &b) { }
あとC++の前にその日本語なんとかして
Tが直接に型に使われなければTは&Tなるからそれは上手くいくということですよね? この理解であってますか? ありがとうございます。
template <class T>
void f(T&& begin, T const & end){}
int main()
{
int x = 0;
// f(x,x); // だめ
f<int&>(x, x); // OK
}
完全転送云々ってよりは、deduced context にならないのが問題っぽいね。
(ドラフト中から該当箇所を探せない。誰か教えて)
あと、
(int&) && = int&
(int&) const& = int&
だから、begin を int& にしたら end も int& になっちゃう。
>>280 みたくしないとダメみたい。
>>280 の第二の変数は参照じゃなくてconst T型だからコピーになって駄目ですね。
>>282 説が正しそうだな。
エラーを見るとint &とint &になってたからな。
良く見ると、280には&が付いてるからあってるな。 俺が間違ってたな。
お前誰だよ
なんでこの板IDないんだ…
というか、本来はIDなんて無いのが2chだよ、何せ「匿名掲示板」だからな 投稿者を識別する必要がある板には付いてる、というだけ ム板は常に投稿者を識別する必要はないだろ? 必要なときに自分のレス番を示せばいいだけだから、つけていない
そもそもこのような過疎板では、一人が一日に何度も書き込むことが少ないから、 ID は大した効果がない。 誰の書き込みか分からないと伝わりにくい書き込みは名前欄にレス番を入れるべきだし、そうしないのはコミュニケーションスキルが低いというべきだろう。
プログラマー的に考えて、掲示板のほうでID出すことで楽ができるならそうしたいだろう
直球でお尋ねする。 IDを出すと楽なのか?
んー、楽かどうかは怪しいが、議論がこんがらがったときの助けにはなるなあ。 もっとも、自分が参加してない議論はこんがらがってたら最初から読み飛ばすけど
293 :
デフォルトの名無しさん :2011/04/14(木) 02:29:11.92
http://www.open-std.org/jtc1/sc22/wg21/ News 2011-04-12: The deadline for the next mailing is 2011-07-22
News 2011-04-13: The 2011-04 post-Madrid mailing is available
News 2011-04-13: The C++ Standard Core Language Issues List (Revision 76) is available
最新ドラフトは N3291 。
変更箇所のマークアップとかを含まない FDIS は N3290 。
member name checking組のnewさんとexplicitさんが退学処分になってしまった。 逆に、constexprちゃんは見違えるように優等生になった。
ユーザー定義リテラルさんがFDISまで生き残ってしまった… 入れる以上はchronoとかのリテラルも用意すべきだったし char32_tとかもわざわざ予約語や組み込み型せずにライブラリで済んだはずなのに 整合性がろくに議論されてない感がプンプンする どうしてこうなった
u8, u, Uの特別扱いはそんな悪くない選択だと思いますが。
悪くないのかもしれないけど、そもそも比較の議論すらされてないように見えるんだよな 見えない所でしてるのかもしれないけどさ
「ソースコードの文字コードが○×だから、 mbcsが○×になっていて、UTF-32にするにはiconvして〜」って、 ソースコードの事情を考えないといけないところが、 コンパイル時に全て解決するのだから、すごくいい判断。 operator ""に任せると、ソースコードの事情を実行時まで持ち込むことになる。 Unicodeが普及してない頃は、文字コード中立な設計で、 もろもろ実行時まで持ち込むのは仕方のないことだったけど。
operator""だってconstexprにすればコンパイル時判断できるんじゃないの?
constexprは、 > 「ソースコードの文字コードが○×だから、 がいやらしいね。 Non-constexprを引数に使われた時は、 実行時に同じ事やらないといけないから、 gccの-finput-encoding=に相当する情報を 実行時まで持ち運ばないといけない。
>>300 コンパイル時計算のほうを exec charset でやれば済む話じゃないの?
ワイド文字(wchar_t)は文字コードを限定しないので曖昧すぎて使いにくい 煩わしい環境依存が減ってC++標準でunicodeが扱えるようになることは一応良いと思う
>>301 exec charsetはiconvの変換先。
お前らって、どのコンパイラーでC++0xしてんだ?
gcc
次のVCが出るまでは使わないな。
今のVCのC++0xは中途半端すぎて使えない
VCだと、ラムダさんとautoさんしかつかってないなー。 スマートポインタ系もたまに使うか??って感じ。
追加されたライブラリの方は結構使うな
どんなライブラリーがあるのかどうやってしらべる? JAVAみたいにSDKマニュアルみたいなのがあればいいのだが VCにしか無さそうだな。
英語読めないのか?
読めるけど?なにか?
ああ、まさか、ライブラリーをboostライブラリーと勘違いしちゃったのかな 標準ライブラリーの中身の話だよ。 付いていけないなら黙っていてくだちゃいねwwww バブバブ
つ libstdc++ reference
>>315 ありがとうございました
ほんとうにどういたしまして
しんせつにどうも
ネットでしらべてみます。
ぼくもこれからは
けんさくします
何だかなあ
震災で、IEみたいに日本では数ヶ月遅れですか?
数ヶ月や数年で済めばいい方
>>320 JIS規格になるのって意味あるの?
どうせ日本製のフル実装のコンパイラなんて出ないと思うんだけど。
意味はないけど新しい用語のセンスない訳には興味ある
JIS用語は通じないことが多いよな
随伴と返却値くらいじゃね?
返り血
それに翻訳間違ってることあるしな。
勝手に大事な脚注消されてたりするしな
329 :
デフォルトの名無しさん :2011/04/21(木) 00:03:18.25
翻訳じゃないし、勝手じゃないし
objective-c++ で auto使う方法ないのでしょうか
c++0xのコードを普通のc++に変換する方法ないですか
どっちも普通のC++だが・・・。 まー、C++0xのコードをBOOSTで置き換えるのが一番労力くわないんじゃね?
そのうちC++03からの差分を赤字にしたFDISとかも作られるの?
あるだろ
あるの? 前のドラフトとの差分ならあるけど
ConceptGCCのサイト消滅
コンセプトさんとは一体何だったのか…
今の規格決まったらまた再燃するでしょ。 ただConceptGCCの中の人は、AppleでCLangやってるし、 ConceptGCC引き継ごうとした人に「最初から実装したほうがいいぜ」って言ってたw
外道だな
そろそろC++0xスレもオワコンだな 誰かC++2xスレ立てろよ
半世紀先かよ
0xってまだやってたのかwww 好い加減あきらめればいいのに
完成まで1年切ってるのにここであきらめるとかないわ
投票は残すところあと1回だけだからね。
次は、TR2を通すんだろう。 来年?
その辺の予定。
結局コンセプトは無し? コンパイルエラーと戦う日々が続くのか
349 :
デフォルトの名無しさん :2011/05/04(水) 17:34:24.43
オブジェクトの生成場所をヒープに限定する private: ~デストラクタ(); オブジェクトの生成場所をスタックに限定する private: void *operator new(size_t); ※ただし、オブジェクトがメンバー変数で作成された場合、 ヒープ上に存在できてしまう。 この辺の小ネタ、0xで綺麗に書けるようになったりしないの?
= delete ;
スタック/ヒープの話は規格とは関係な・・・って話とは違うか。 しかし生成場所をスタック/ヒープに限定するって話でもないな。
動的生成の強制または禁止ということだろうけど 言語仕様でサポートするほどありがたいものには思えん というか何に使うんだそんなもん
というか、newを使えなくしても、 placement newされればどうしようもない。
>>352 スマポをnewするようなバカな事を避けるとか、
外部からのdeleteでデストラクタを呼ばせず、破壊用の関数を呼んで
オブジェクトを廃棄させたい場合とか(例外が起こりうる処理は、
デストラクタでなく破壊用関数の中で処理する。)
>>353 確かになぁ。
そんな事するバカはこんな局所的な所だけ救っても無駄だろ
ドット演算子のオーバーロードはなぜ追加されないのですか?
>>356 どうやってオブジェクト本体のメソッド呼び出すんだよ。
あと、ドットの呼び出しで別のオブジェクトのメンバーを呼び出すなら、
最初からその別のオブジェクトを使ったって動作は変わらん。
コンストラクタをprivateにしてfriendなファクトリを使って //ヒープ限定 HOGE * pcreate(){return new HOGE;} HOGE * p = pcreate(); //スタック限定 HOGE rcreate(){return HOGE();} const HOGE & ch = rcreate(); そいで0xからは //スタック限定 HOGE rcreate(){return HOGE();} HOGE && rh = rcreate(); とかかな。
コピーもムーブも封じないとダメだね でもそうなると標準コンテナ使えなくなるし… ちょっと利点と欠点が釣り合わないかな
>>358 friend使うくらいならstatic関数使った方がよくね。
>>349 > オブジェクトの生成場所をヒープに限定する
> private:
> ~デストラクタ();
これ delete できなくならない? cl が間違ってるの?
>>361 外からは破壊できないよ。
実際はこういう使い方。
public:
void Destroy()
{
//例外が起こり得る後始末
delete this;//内部からなら破壊できる。
}
private:
~デストラクタ()
{
//例外の起こらない後始末
}
もしくは、friend宣言したクラスや関数からしか使えないクラスとかかな。 あんまり現実的なテクニックじゃないけど。
結局こういうのは汎用性のない小細工になるわな 考えるだけ無駄無駄
365 :
デフォルトの名無しさん :2011/05/05(木) 00:08:38.29
無駄無駄無駄ァァァーッ!!
なーる、内部でdeleteすればいいのか
外部で直接deleteさせない事が目的の一つだからね。 「デストラクタの中から例外は送出してはいけない」(デストラクタ内で例外処理するのはアリ) これを実現するための一つの手段。 他の人はどうやってんのか知らんけど。
デストラクタで例外ってどんな作業してんだ?
C++0xの次の企画でいいから 参照カウント型の張替え可能参照を組み込んで
無理してデストラクタで開放しなくてもいいんじゃないのさ
RAIIだとデストラクタでリソース開放することが多くなるよね
>>372 工夫してって、デストラクタやdeleteを封印とか余計に無理してるじゃん
デストラクタやdeleteを封印するのはデメリットのほうが大きいよ
>>373 オブジェクトとリソースの寿命が必ずしも一致しないといけないなんてことはない
RAIIにこだわらなくてもリソースの開放漏れを防ぐ方法はいくらでもある
代替案は?
>>375 とりあえず std::fstream::close() があるな。
あるけど、デストラクタで閉じられるから大抵のヤツは無視するだろ。
どうりでC++はウンコプログラムが多いわけだ
>>378 C で fclose() を忘れずに呼んで忘れずに戻り値チェックするのに比べればちょっとはマシ。
>>381 え?プログラムと人を比べるの?何の話してるの?
デストラクタ内のエラーはシステムを信じて握りつぶす。通はこれだね
容量オーバーでエラーが返ってきたなら、無駄なファイルを削除する事で救えたデータもあっただろうに。 ネット越しなら再接続して送信を試みる事もできたろうに、ああかわひそふなことほした。
結局のところ処理内容によるんだよね やるべき事は文法的にデストラクタを縛ることじゃなくて 処理内容に合わせたエラーハンドラの設定だよ
結局コンストラクターでクローズ時のハンドラ設定出きるようにしとくのが現実的か。
>>376 それって例外なり戻り値でエラー反したっけ?
つうか、closeでエラーが帰ってきたとしても特に何もする事はない。 close以前に問題がある事が普通だからな。 エラーメッセージとかログを残す事は必須だな。
デストラクタで処理できないエラーは 無視できることにしたいんですね、わかります
>>388 exceptions(failbit) 設定しとけば close() 失敗で例外が飛ぶ。
デフォルトのまま例外使わないなら、 close() のあと fail() や
good() や operator void* () で見ればいい。
>>389 書き込んだつもりのデータがバッファに溜まってただけで
書き込めてないことがあるんだよ。危ないよ。
>>389 ログ書き出しのcloseでバッファにメッセージが残ったままエラーが起きたらどうするんだろう・・・。
デストラクタでの処理は保険で 失敗する可能性がある奴は明示的に処理すればいいじゃない
というわけで 376 に戻るわけだ。
そんな半端な保険ならないほうがいい デストラクタ呼ばれるまでに明示的に閉じてなければアサートを出すべき 起こりうるけど確率の低いバグしかもファイル処理でとか最悪のパターンだわ
動画書き出しててディスクの容量足りないとかザラにある訳だけどな。 パーティションが一つとは限らんから別のパーティション利用したり何らかの対処している編集ソフト結構ある。
何スレだよ
C++0xでもエラー処理は楽にならない、というスレ
どっかのまとめサイトでも居たがデストラクタで云々言う奴はなんでclose時にしかエラー捕捉しないのか
バッファの書き込みはリソース解放ではないので、RAIIで処理する事は望ましくない。
>>399 少なくともこのスレじゃ誰もそんなこと言ってなくね?
勝手に相手をアホ認定すんなよ
誰もアホとか言ってないのになに切れてんだか
エラーも満足に補足できないプログラマは総じてアホだ
プログラマなんて道を選んだプログラマは総じてアホだ
エラーハンドリングが必要なら、先に明示的にバッファをflushしてからcloseするようにすればいいだけじゃん。 flushが成功したのにcloseが失敗したら、もうそれはアプリケーション側では回復不可能なエラーとして握りつぶしていいんじゃない?
わざわざデストラクタで閉じる前に flush() するくらいなら そこで close() しちゃえば良いのに
>>406 いや、普通は
write()*n + flush()
が一つのトランザクションであり、
open() + トランザクション*m + close()
までがライフサイクルだろ?
だから、flush()とclose()は別にするべきだろう。
0xの話題がなくなるといつもこの話題が盛り上がるね
409 :
デフォルトの名無しさん :2011/05/05(木) 21:14:12.18
で右辺値参照は?
退学騒動がひと段落した後 変化があったとは聞かないけど
デストラクタでごにょごにょの件は Effective C++に書いてなかったっけ 今手元にないから記憶が曖昧だけど
ここはアプリケーションの不具合の責任を言語に押し付けるスレですか?
デストラクタの前に、エラーチェックをしないとコンパイルエラーにできる構文があってもよかったかもしれん。
>>413 explicit デストラクタさんか…。
スコープの最後に明示的に呼び出さなければエラー、とか。
動的に確保した時厳しそうだな
>>415 delete直前のポインタにかかるようになってたら可能かも。
ただ継承関係を考えたら面倒くさそうだ。
gccで char16_t *c=u"あいうえお"; みたいにやっても出来ないんですけど。 どうやったら出来るんですか? 英数字なら出来るけど良く分かりません。
>>417 期待した結果と実際の結果を、違いがわかるように書きなさい。
ソースの文字コードは
何も設定変えないでエクリプスでやったやつだけど
uはユニコードにエンコードしてくれるしるしだから 文字コードは関係ないでしょう。
gccを新しくした場合、gccの認識する日本語文字コードが変わってる場合も
よくわからないのでとりあえず一発で解決する文字コードの直し方教えてください。
ASCIIのみ。これ鉄板。
とりあえず確認したコードを全部載せろや
これがガチ char16_t * c = u"\x42\x30...
u だと4桁になるんじゃない?
> u だと4桁になるんじゃない? ああそうだった。それと文字列リテラルはconstで受けるべきだからこうか const char16_t * c = u"\x3042...
C++0xでconstなしじゃポインタでリテラル受けれなくなったっけ?
その暗号みたいな数字しかuをつかって0xは受け付けてくれないのか?
>>429 配列からポインタへの暗黙変換のルールの中でconst外しの例外がバッサリ削除
コンパイルするときは
2.2 第1段階
ソースファイルのキャラクターセットをユニコードに変換する。
(ただしASCII以外のはすべて \uXXXX の形にエスケープする)
2.2 第5段階
全ての文字リテラル・文字列リテラルを execution character set に変換する。
エスケープされてるやつも全部文字に置き換える。
(もし変換できない文字なら井桁みたいなのに置き換える)
2.2 第7段階
全ての字句が構文的・意味的に解釈される
という段階を踏むんだけど
>>417 は 第一段階で失敗してるんだろう。
俺、前も同じこと書き込んだけど、ドラフトを読む限り、
u'あ';
は、第5段階で一度 execution character set になった後、
もう一度第7段階でユニコードに変換されるっていうステップを踏む気がするんだよね。
だから
u'☃'
は第五段階で u'(井桁)' になった後、もう一度第7段階でユニコードに変換されて
ユニコードの井桁記号(本当はimplementation definedだけど)が出てくると思う。
>>430 ソースファイルの文字コードが問われない形にできるから、
>>433 のいう理由、しかも一番起こりやすい、では失敗しないってことでしょ。
gccに食わせるソースファイルのエンコードはUTF-8にしておけ。
437 :
433 :2011/05/06(金) 20:25:05.92
すまん。単語を間違えてる。井桁は # じゃねえか。 = の太字ってなんていうんだっけ…
〓下駄
>>435 iconvがリンクされてないgccバイナリはだめだけどな
普通に使われてるSJISの文字は変換されないということか? uで変換できるのは#/4343のような暗号の様な文字列をユニコードに変換する印ということか。 それならSJISの文字を暗号の様な文字列に変換するようなマクロがあれば良いな。 誰かつくってくれないかなぁ。
basic source character set以外の文字をソースファイルに使えるかどうかは実装依存。
出力を表示するところもSJISでないとだめだから 出力するときもユニコードからSJISに変換しなければいけないな。
Shift_JISはmbcsとして扱うのも大変だしね。 日本人以外の処理系開発者からしてみれば、 なんでこんな阿呆なcoding system使ってるのかと思うだろうね。
まだ続いてたのか。
>>440 uとかの文字列リテラルの前置は変換を指示なんかしない。
uはそれに続く文字列リテラルのバイト列をUTF-16の文字コードとみなしてくれとコンパイラに要請するだけで
それが実際にUTF-16の文字コードであるかはコンパイラにソースを渡すものが保障する必要がある。
reinterpret_castでポインタを無理やりキャストした場合の動作に近いイメージ。
double型の値へのポインタをreinterpret_cast<int*>でint型へのポインタに変換してint型の値として参照しても
期待したようなint型の値に変換されるわけではないのと同じ。
>>444 規格上の定義と実装上の都合をごっちゃにするなアホ。
最低でもascii<-->unicodeやunicode間の変換くらいはできるはずだがな(でないと意味がない)
>>426-428 からして、
u"\u〜"じゃなくて、u"\x〜"だしなあ。
ちょっとスレの焦点が定まってないね。
struct hoge : typedef long_type_name t: public fuga< t, aloc<t>>{}; こういうこと出来るようなればc++もっと流行るのに
長くなったけど結論としては、 エクリプスでエディターの文字コードをユニコードにして 出力の文字コードもユニコードにして、 GCCに入力されるソースコードがユニコードであると指定すれば良いわけだな。 しかし、将来的にはS-JISコードがuによってユニコードに変換できるようになる んだろうか?かりにそうならそうなるまで待つけど、そうじゃないならこうするしかないな。
>>444 > uはそれに続く文字列リテラルのバイト列をUTF-16の文字コードとみなしてくれとコンパイラに要請するだけで
> それが実際にUTF-16の文字コードであるかはコンパイラにソースを渡すものが保障する必要がある。
いや、それは誤解だ。
たとえば ソースがSJIS だとするなら、翻訳段階 1で
"あ" (22 82 a0 22) -> "\u3042"
u"あ" (75 22 82 a0 22) -> u"\u3042"
と変換される。(たとえ u がつかなくてもユニコードの番号に変換される)
次に、たとえば実行形式のキャラクターセットが SJIS だとするなら、
翻訳段階5 で、文字列リテラルの中身が SJIS になる。
"\u3042" -> "82 a0"
u"\u3042" -> u"82 a0"
(u がついていても SJIS になる)
次に、翻訳段階7 で、このリテラルを意味的に解釈するに及んで、
u がついてるのは UTF-16 に変換される。
"82 a0" -> バイト列 82 a0
u"82 a0" -> バイト列 42 30
Unicodeスレでやってくれ 荒れるから
452 :
450 :2011/05/10(火) 12:42:26.09
だから実行形式が純粋な ASCII の環境では、 u'\uXYZW' は一般に 0xXYZW と等しくない。 等しくなるのは 0xXYZW が 127 以下のときのみ。 俺はこの事実を信じたくないから 誰か根拠を添えて反論してほしい。
いや
>>450 はC++0xの規格の話だろ。
もともとCのTRだったから、Cのスレというのならまだ分かるが。
>>452 なにがだからかわからんが\uと\xは別物なんだから
等しくなるのは当然限定された条件下だけだろ
(純粋ASCII環境の意味とそこに限定する意味もわからんが)
(ソース表記 > 最終的な内部でのバイト表現)
"\u3042" > 82 a0 (実装依存 実行キャラ:sjis)
"\x3042" > 42 30 (実装依存 バイトオーダーLE 範囲外:mingw-gccの場合)
u8"\u3042" > e3 81 82
u8"\x3042" > 42 (実装依存 範囲外:mingw-gccの場合)
u"\u3042" > 42 30 (実装依存 バイトオーダーLE)
u"\x3042" > 42 30 (実装依存 バイトオーダーLE)
U"\u3042" > 42 30 00 00 (実装依存 バイトオーダーLE)
U"\x3042" > 42 30 00 00 (実装依存 バイトオーダーLE)
456 :
450 :2011/05/10(火) 19:22:00.80
>>455 \u と \x が別なのはいいよ。それは当然だよ。
だけど u'\u1234' != 0x1234 は気持ち悪くないか?
主観で語られましても
>>456 なんで気持ち悪い?
そもそも文字の内部表現を仮定して数値と比較するのは '0' == 0x30 でさえ真になるかは環境依存。
(今更非ascii系を考えてどうなるってのは置いとけ)
文字の内部表現が具体的にどういう数値になるかを仮定するのは危険ってのが
ユニコード文字にも変わらず適用されてるだけと思えばなにも気持ち悪いことはないだろ。
(そもそもそれからして気持ち悪かったというのなら、まあ・・・)
459 :
450 :2011/05/10(火) 21:58:44.65
>>458 実行キャラセットが 7bit ASCII の環境で、
ファイルに utf-8 で「こんにちは」と書きだしたいとき
std::fwrite(u8"\u3053\u3093\u306b\u3061\u306f", 1, 15, stream);
と書いても正しく出力されないんだぜ?
あるいは utf-8 のファイルから読み込んで strcmp しても一致しない。
結局処理系依存になるなら、何のためにユニコードを規格に取り込んだんだかわかりゃしない。
それに '0' == 0x30 は環境依存だけど
'\x30' == 0x30 が環境依存だなんて思ったことないよ
(char のビット幅が 5bit しかない、みたいなときを除けばだけど)
そもそも「実行キャラセットが 7bit ASCII の環境」なんてものがあるかどうか。
>>459 実行キャラセットが 7bit ASCII の環境で非ASCII文字が出力できるのか?
環境が融通を利かせて表示してくれるとしても各データが7bitまでで表現されてるバイト列を文字列として渡さなければならないだろ。
各データが8bitまでフルに使うUTF-8でエンコードした文字列を渡して正しく表示されるほうが驚きだ。
(8bitのデータを受け入れ可能なら7bit環境じゃないだろ)
charが最低8ビットって保証されてなかったっけ? 7bit環境ではそもそもC言語が使えないとかの話になるとおもう
>>462 charが1バイトで、sizeof(char)が返すのは1だという事は保証されている。
ただし、1バイトが何bitかは規定していない。一般的な用語で言えばchar型が
4byteな環境でも、C言語の規格で言えば単に1バイトが32bitな環境になる。
>>462 が、 signed char が -127 から +127 の範囲を表現できることは規定されてるな。
だから、実質的に最低8bitというのは課程できるだろうな。
>>460 ,461
7bit ASCII という例が悪かったよ。日本語が全く使えない環境、という意味でしかなかった。
たとえ 8bit環境でも、実行キャラセットがひらがなを含んでいないLatin-1ならば、
u8"\u3053\u3093\u306b\u3061\u306f" は utf-8 の「こんにちは」とバイナリ表現が一致しない。
Unicodeを(実行時キャラクターセットを無視した)バイナリとして吐き出そうとしても
規格上リテラルが一旦実行時キャラクターセットを経由した変換がされてしまうので
化けてしまう、という危惧はよくわかるが
実際問題
>>433 みたいな変換を馬鹿正直に実装してるコンパイラなんて無いと思うので
気にしなくてもいいような
よくわかんないけど文字コードって怖いですね ヨーロッパ人はもっと怖いんだろうな
>>465 mingw-gcc4.5.2でfexec-charset=Latin-1で試そうとしたら
実行以前にiconvがUTF-8からlatin-1への変換をサポートしてないとコンパイルエラーにされたでござる
469 :
468 :2011/05/11(水) 00:49:16.51
iconvだとlatin1指定でござったorz しかしmingw-gccでは内部でのバイナリ表現のずれはみられなかったでござるよ(環境によるでありましょうが) テキストとしてファイル入出力を行ったゆえになにかしら無用な変換が入ったのでござらんか? // fexec-charset=latin1 int main(){ const char cc[] = u8"\u3053\u3093\u306b\u3061\u306f "; for (int i=0;i<15;++i){ int c = (reinterpret_cast<const unsigned char *>(cc))[i]; std::cout << c << ","; } return 0; }
470 :
450 :2011/05/11(水) 06:39:56.45
>>469 うん。実行キャラセットにない文字の処遇は処理系依存で、どう扱ってもいいので
gcc が latin1 でも utf8 をうまく扱ってるのは理解できるんだよ。
(実行キャラセットの最終的なエンコーディングは latin1 でも、
文字集合自体は unicode を包含していても構わないわけだし)
問題はそのGCCの挙動がISO準拠を謳うコンパイラに共通なのかどうかで。
n3290の俺の読み方が間違ってて本当は大丈夫なんだ、という指摘がほしかったんだけど
GCCでやってるぶんには大丈夫ってことでまあいいや。d
ユニコードのコードポイントと16進数が恒等置換ではないとっていうなら コードポイントと16進数の対応は全単射なら何でも良いって分けか?
>>471 規格上はあるユニコード文字一文字を表現しているchar16_t,char32_t型の値はその文字のコードポイントの値と等しくなるとなっている。
それとは別にソースにuniversal-character-name記法でユニコード文字Aとして書いた文字であっても
実行キャラセットへの(不要な)変換およびユニコードへの再変換を経て実行段階ではAと異なる文字A'になるかもしれないのか?って話。
それで、もしそうならやだなあとか、
もしそうなら文字Aのコードポイントの値を直接使ったプログラムは意図したとおりに動かないことがあるなあ、って話。
それとは別にソースのユニコード指定した文字/文字列リテラルにuniversal-character-name記法でユニコード文字Aとして書いた文字であっても だな。
>>450 の解釈はどうも違うようだ。
間違ってると思うのは二点。
1 翻訳段階5で全ての文字列リテラルが単一の実行文字集合を使って変換されるとしたこと
2 翻訳段階7で再変換が行われることがあるとしたこと
翻訳段階5では複数の実行文字集合の中から文脈に応じて適切な文字集合が選ばれて変換に使われる。
根拠になりそうなのは以下
2.14.3
> The value of a wide-character literal containing a single c-char has value equal
> to the numerical value of the encoding of the c-char in the execution wide-character set, unless the c-char
> has no representation in the execution wide-character set, in which case the value is implementation-defined.
ただのexecution character setと異なるexecution wide-character setが存在することが示されている。
2.14.3
> A universal-character-name is translated to the encoding, in the appropriate execution character set, of the
> character named.
(文脈に応じた)適切なexecution character setの中の文字に変換されると読める。
翻訳段階7での再変換は翻訳段階5の誤った解釈により生じた問題を解決するための解釈のようだから
翻訳段階5の解釈が変われば不用。
上記の解釈に基づく挙動 例としてソース文字集合SJIS、実行文字集合SJISを指定、リトルエンディアン環境。 翻訳段階 1 基本ソース文字集合にない文字はユニバーサルキャラクターネームに置換される。 "あ" (82 a0) -> "\u3042" L"あ" (82 a0) -> L"\u3042" u8"あ" (82 a0) -> u8"\u3042" u"あ" (82 a0) -> u"\u3042" U"あ" (82 a0) -> U"\u3042" 翻訳段階 5 リテラル中のエスケープシークエンスやユニバーサルキャラクターネームは 文脈に応じた実行文字集合内の該当する文字(を示すバイト列)に変換される。 "\u3042" -> 82 a0 (実行文字集合に指定したSJIS文字集合内の文字に変換) L"\u3042" -> 42 30 (環境依存の文字集合内の文字に変換。ここではUTF-16とした) u8"\u3042" -> e3 81 82 (接頭辞u8という文脈からUTF-8文字集合内の文字に変換) u"\u3042" -> 42 30 (接頭辞uという文脈からUTF-16文字集合内の文字に変換) U"\u3042" -> 42 30 00 00 (接頭辞Uという文脈からUTF-32文字集合内の文字に変換)
SJISは変換されないんじゃ?
477 :
450 :2011/05/13(金) 00:12:17.02
>>474 execution character set と execution wide-character set は↓で定義されているから
2.3-3
> The execution character set and the execution wide-character set
> are implementation-defined supersets of the basic execution character set
> and the basic execution wide-character set, respectively.
↓の "appropriate execution character set" は
narrow か wide かのどちらかだと思いこんでいたんだけど
2.14.3-5
> A universal-character-name is translated to the encoding,
> in the appropriate execution character set, of the character named.
確かに考えてみれば、UTF-32 や UTF-16 は
wide-character string でも narrow-character string でもないから
UTF-32/16に対して execution (wide-)character set は
どちらも "appropriate" とは言えないね。
ここでユニコード文字列にはユニコード自身が execution character set だと考えれば
万事上手に収まる、と。
なるほど…。そんな気がしてきた。
でもそれなら
the appropriate "execution" character set と限定するんじゃなくて
the appropriate character set って程度の表現にしないと誤解招くよなあ。
過去のメーリングをたどってみたら n2018 New Character Typers in C++ にてユニコード文字列が提案されてた。 universal character nameが導入されたのはもっと前。 文字列が narrow か wide の二種類しかない状態のときに 現在の翻訳段階 5 の文や 2.14.3-5 の文が書かれた。 そして n2018 でユニコード文字列を提案するときに、 翻訳段階 5 と 2.14.3-5 の修正を提案し忘れている。 具体的に Working Draft に組み込まれたのは n2284。 ここで n2018の通り加筆されたのが見て取れるけど、 "execution character set" に変換するという記述が 修正されることは、ついになかった。
"execution"あるとなんかまずい? > in the appropriate execution character set これはユニコード系とは限らないよね。
2.14.5-13
> [ Note: This concatenation is an interpretation, not a conversion.
> Because the interpretation happens in translation phase 6 (after
> each character from a literal has been translated into a value from
> the appropriate character set), a string literal’s initial rawness
> has no effect on the interpretation or well-formedness of the
> concatenation. --end note ]
↑翻訳段階 6 で結合が起きる前には、
各文字はすでにそれぞれ適切な文字集合のコード値に変換されている、
と注釈されてる。(ここには "execution" という単語はでてこない)
だから phase 5 はやはり
"" は実行文字集合
L"" はワイド実行文字集合、
u8"", u"", U"" はユニコード
へそれぞれ適切に変換する、という意味で言いたいんだろう。
しかし conversion でなくて interpretation だ、というのは
どういう意味なんだろう。
>>479 execution (wide-)character set についての説明が
narrow/wide の二種類しかないような書き方だからまずいよ。
ないような、というか二種類しかなかったんだよ。書かれた当時は。
本筋の流れとは違うが説明しておくと
>>480 > しかし conversion でなくて interpretation だ、というのは
> どういう意味なんだろう。
これはそれまで『連続する複数の文字列リテラル』とみなしていたものを
これ以降は『(それらが連結された)ただ一つの文字列リテラル』とみなすことにする、という解釈の変更を行うだけで、
各文字列リテラルのバイト列はなにも変換されないといっている。
なぜこの注記が必要かというと例をあげる。
(実行文字集合はsjisとする。)
ソース: u"あ" "あ"
翻訳段階1: u"\u3042" "\u3042"
翻訳段階5: u"42 30" "82 a0" (厳密には 75(u) 22(") 42 30 22(") 20( ) 22(") 82 a0 22(") というバイト列)
翻訳段階6: u"42 30 82 a0" (とみなすことにする)
後ろの文字列リテラルのバイト列 82 a0 はユニコード文字を示すものとみなすには本質的に不適切な値だが
翻訳段階6では何も変換されずにただ連結される。
ソースの書き手としては u"ああ" と書いた場合と等しい結果を期待するかもしれないが
そうはならないので注意をうながしている。
>>480 > u8"", u"", U"" はユニコード
> へそれぞれ適切に変換する、という意味で言いたいんだろう。
この変換は必須ではないから解釈という言葉が出ているのでは?
>>481 // g++ (4.6.0) -fexec-charset=sjis -std=c++0x
#include <cstdio>
int main()
{
std::puts(u8"うにこーど" "えすじず");
};
↑utf8の端末できちんと表示されるんだが…。
もちろん u8 を消すと、文字化けして表示される。
>>481 の通りだとすると"えすじず"は文字化けしないとおかしい。
(これは文字集合の変換・逆変換で非可換かもという問題とは別)
485 :
481 :2011/05/13(金) 19:45:40.96
>>483 ならどこかの処理に関する規格の解釈が違う。
翻訳段階6での処理に関する
>>481 の解釈が違う可能性もあるが
翻訳段階5での処理の解釈が違う可能性-
翻訳段階5の変換では翻訳段階6での結合を考慮したうえで変換すべき実行文字集合を決める。
>>481 の例だと後ろの文字列リテラルが翻訳段階6の結合でchar16_t文字列リテラル(の一部)になることをみこして
UTF-16文字集合に変換する。
翻訳段階5: u"42 30" "42 30"
-もある。
C++0xのスレかと思ったら違うスレに迷い込んだようだ
間違ってはないよね
C の n1539 を読むと
6.4.5-6
> phase 7 でケツに 0 を付加して、
> ・"" はマルチバイト文字列そのまま、
> ・L"" はマルチバイト文字列を mbstowcs で変換したもの、
> ・u8"" はマルチバイト文字列を UTF8 に変換したもの、
> ・u"" はマルチバイト文字列を mbrtoc16 で変換したもの
> ・U"" はマルチバイト文字列を mbrtoc32 で変換したもの
> で、それぞれ初期化する。
>
> 実行文字集合にないマルチバイト文字が
> 文字列リテラル中でどういう値になるかは実装依存。
と書いてあった。
C++ がこれと同じことをするなら、結局いろいろ意見はあったけど
>>450 は正しいということだな。
なるほど。ということは結局 > それとは別にソースのユニコード指定した文字/文字列リテラルにuniversal-character-name記法でユニコード文字Aとして書いた文字であっても > 実行キャラセットへの(不要な)変換およびユニコードへの再変換を経て実行段階ではAと異なる文字A'になるかもしれないのか?って話。 もありえるということになるのか?
処理系による。
状況不明は変わってないような気がするぞ。
規格に明確な文面はないが整合性の点で execution character set と execution wide-character set に加えて
execution unicode-character set が存在して翻訳段階5でユニコード文字列リテラルの変換に使われると解釈すべきでは
接頭辞なしのリテラル <-> execution character set
L"" ワイド文字リテラル <-> execution wide-character set
u8"" u"" U"" ユニコード文字リテラル <-> execution unicode-character set
という論点がでてきてるのだが。
それと混同して話を進めてる場合があるが文字集合と文字集合内の各文字の表現方法(エンコード方式)は別物だな。
>>475 の翻訳段階5とかはその意味では明らかに間違い。
480だけど、
>>480 で引いた注釈は、RAW文字列に対する言い訳だって気がする。
> This concatenation is an interpretation, not a conversion
結合は解釈であって変換ではない。
[=「raw stringは変換を受けない」云々の事柄とは無関係だ]
> Because the interpretation happens in translation phase 6 (after
> each character from a literal has been translated into a value from
> the appropriate character set),
この、結合に望んでの解釈は、
(文字列リテラル中の個々の文字が、適切な文字集合内の要素に変換された後の)
第六段階で起こるから
[= すでにエスケープシーケンスなどは変換済みだから]
> a string literal’s initial rawness
> has no effect on the interpretation or well-formedness of the
> concatenation
文字列リテラルが最初 raw文字列であろうがなかろうが
それは結合時の解釈や整合性にはなんら関係ない。
そうするとこの部分から
"a value from the appropriate character set"
を抜き出して「第五段階ですでにエンコード済み」とは言えなくなる。
「コード値に変換された」ではなくて
「エスケープシーケンスが一文字に変換された」という意味だから。
>>483 みたいに-fexec-charset=sjis
をつければuでユニコードに変換できますか?
>>493 exec-charsetがどうかということとu付けたリテラルがユニコードで表現されるかということには何の関係もない。
意味もわからず呪文を唱えるのでなく仕組みを理解しな。
誰も教えてくれないからsjisはgcc4.5じゃなくて4.6から対応しているということで自分を納得させてみよう。
C++0xおっかけたいけどgccのビルド方法がイマイチわかんなくてどうにも・・・ どっかに初心者用解説とかないん?
じゃあバイナリで落とせば?
498 :
デフォルトの名無しさん :2011/05/18(水) 10:40:35.97
499 :
デフォルトの名無しさん :2011/05/20(金) 23:05:41.38
ここ1年ほどおっかけてないけど、何かあった?
FDIS可決
Final Draft International Standardね。ありがとう。 しかし、GCCで動くぶんは使ってるから、ユーザ側としては規格より実装ヨロって感じです。
( ゚д゚)ポカーン
仕事で安心して使えるようになるのはいつごろですか?
仕事の要件に従え 上司・責任者に聞け 自分の判断で好きにしていいなら自分で判断しろ
>>507 reset() を使うあたりが、どうもぱっとこない。
そもそも標準のスマポの使用作法なるものが良く分からないんですけどね。。
get() とか release() とか reset() とかを、スマポを使用する側で呼び出すと、
本来 std::unique_ptr<T> がもつ所有権移動のセマンティクスが壊れてしまうような気がして、気持悪いのです
509 :
デフォルトの名無しさん :2011/05/21(土) 15:47:34.38
それはないだろ
つまりunique_ptrのセマンティクスを意図的に壊すためのget メンバを pointeeのオブジェクトをクローンするときに用いないといけないのが 気持ち悪い、ということか?
X& operator=( const X& that ) { if( this != &that ) { *this = X(that); } return *this; } ↑はresetを使わずさらに例外安全の強い保障も提供する
>>508 release() についてはわかるが、 get() や reset() を嫌がるのは意味が解らん。
>>508 コピー不可のメンバがあるクラスにコピーコンストラクタとコピー代入演算子を実装しようとしてるんだから
すっきりしないコードになるのは当然のような気がする。
pimpl_ptrをパパっと作ってそれに持たせればおk
そもそも代入ってリセット以外の何物でもないんじゃないかな。
c++で仕事って、どんな案件なのか想像できない
517 :
デフォルトの名無しさん :2011/05/21(土) 22:17:38.55
ゲーム
>>516 一昔前で言うところのシステムソフトウェア。
カーネル、ブラウザ、ライブラリなど
※但し、Windowsに限る
>>519 /\___/ヽ
//~ ~\:::::\
. | (・) (・) .:|
| ,,ノ(、_, )ヽ、,, .::::| は?
. | `-=ニ=- ' .:::::::|
\ `ニニ´ .:::::/
/`ー‐--‐‐―´\
ここはまともなC++スレなんで 荒らさないでください
ついにこのスレまで来たか
結局C++で純粋関数型記述できるようになる?
テンプレート使えば今でも出来るよ
C# でのプロパティとかインターフェースとかイベントとかは 導入されないんですか?
プロパティは却下です。 あまりにもC++的でないので当然です。 なにかもっとよりprimitiveなoperatorに還元できれば加えられるかも。 インターフェースはもっと強力なconceptがC++1xで議論される予定です。 イベント構文はアドホック過ぎてC++には付け加えられないでしょう。 C#はperlみたいにアドホック構文バンバン導入する流儀だけど。
お前誰だよ
オレオレ俺だよ
>>525 signatureじゃあるまいし、完全抽象化classで代用できるinterfaceはあっても意味ないだろ。
イベントって、Win32由来のEventObject? それともDelegateの事?
Delegateなら、無名関数で十分だろ。
Propertyってobject.value += x; と書いたとき、
object.SetValue(x+object.GetValue()): って展開されるって知ってる?
仮に、operator+(xの型,objectの型)がオーバーロードされてて
operator+の中で例外が発生したとすると、GetValueから受け取ったObjectが
何らかの理由で漏れる可能性がある。そういう訳で当分は実装されんだろうね。
例外を投げるoperator+とか最悪じゃないか
何故そう思ったの?
例外のことよくわかんないからに決まってんだろ。言わせんな。恥ずかしい。
std::string::operator+ は bad_alloc 投げるよね。
operator+はともかくoperator/なら有理数とかでゼロ除算で例外投げる 可能性はあるよな。まぁ、intやdoubleが例外投げないんでそれが正しいとも言えんけど。 あと、operator+=で要素追加可能なset系のコンテナがあったとするとoperator-=で 要素削除するのは自然。コンテナに要素がないのにoperator-=したら 大体例外出すように実装するだろうね。
>>529 インターフェースってのはgenericsのtype constraintのことじゃね?
だから回答としては
>>526 の「conceptで対応する」でいいと思う
>operator+=で要素追加可能なset系のコンテナ オエッ +を足し算以外のセマンティクスで使うのはやめて下さい 本当にやめて下さい
intの0除算はCPU例外を出すのが普通じゃないか
singned のオーバーフローで投げられる可能性も
もうさ全部SafeIntでいいんじゃない
setで+といえば普通は和集合だし-といえば差集合だよな 要素の追加削除とかないわ
要素か?
>>540 こんなかんじか。
set super = (set){10,20,5,8} + (set){4,3,2};
super == (set){10,20,5,8,4,3,2};
※面倒なんでソートはしてない。
そういや初期化リストって、キャストはできないんだっけ?
>>541 文字列の結合は可換でないから加法ではないね
+記号を使うのは完全な間違いだ
別の演算子を導入したD言語が正しい
代入複合型も含めて四則演算子での例外はトラップ手段の無い不正落ち処理にしてしまおう。
よしBASICみたいに文字列結合は&で
浮動小数の < は順序じゃないから別のオペレータ考えるべきだねって言ってるようなもんだよ > 可換でないから加法ではないね
>>546 & は優先順位的に不便。
if("a" == str1 & str2) // だめ
* がオススメ。
非可換でも誰も文句言わないし。
>>548 *は文字列をベクトルとみなしてかけ算したい時に困る。
>>550 "hello" * "world"で一体何が出来上がるんだ?
>>544 string last_name = name - string("mike");
みたいに引き算も用意したらある程度可換じゃね?
string("will") + ( name - string("jhone") );
これで数式らしく置換もできる。おっせぇけど。
文字列の掛け算は繰り返しっぽい
>>552 意味がわからない
それが可換性と何の関係があるんだ?
文字列の * はあれだよな "x" * 3 -> "xxx" とかだよな
じゃあ / か % だな % はPythonのアレっぽいから / が一番だ
C++的には<<がいいんじゃね iostreamでもつかうし
->*「俺の出番のようだな」
>>552 operator = に渡ったとき遅延評価で Add< string, Sub<string,string> >を受け取って
置換処理に渡せばある程度早くはできそうではあるな。
>>554 値と同列に扱えるってことじゃないの?
もしかして、2項演算子の左右可換の事言ってる?
あなたは値と同列に扱えることを可換と言うのか 斬新ですね
*の意味的には 3 * "x" -> "xxx" のほうが綺麗だな プログラミング的には最悪だは
string("Hello ") + "world!" == string("Hello world!") string("Hello ") - "world!" == string("Hello world!") string("Hello ") * "world!" == string("Hello world!") string("Hello ") / "world!" == string("Hello world!") string("Hello ") % "world!" == string("Hello world!") string("Hello ") << "world!" == string("Hello world!") string("Hello ") >> "world!" == string("Hello world!") string("Hello ") ->* "world!" == string("Hello world!") うーん
何で++案が出ないのか
節子、それ単項演算子や
C++に2項の++なんてあったっけ AviSynthっていう動画用スクリプト言語兼フレームサーバでは++を結合に よく使ってますが、どうでもいいですねすみません
>>561 置換可能を可換というのが一般的な日本語じゃなかったっけ?
うちのおかんにとっては、CDもBlu-rayも円盤という言葉で可換な存在だ。
また、バーチャルボーイもゲーセンの筐体も、ファミコンと可換だ。
手こずっているようだな尻を貸そう
>>563 (string){"Hello ", "World"};
でよくね?
>>567 ここでの可換というのはオペランドが可換かどうかの話だろ。
数学用語で使う意味の可換性だべ
2項演算に関するコンテキストでは、可換と言ったら 交換法則、すなわち a・b = b・a が成立することを指し、それ以外を意味しないのが普通だと思う
^_^はどうよ
それは空気と識別子_と空気をxorしてるんですかね
せっかくオーバーロードあるんだし "hello"*3=="hellohellohello" "hello"*"world"=="helloworld"
文字列が可換にならないのは、文字列のバイト表現と、 文字の順番が独立していないから。 つまり順番を独立させればいい。 nstring name = nstring(1,"Second") + nstring(0,"First"); name == string("FirstSecond"); name = nstring(1,name) + nstring(0,"Xero"); name == string("XeroFirstSecond"); name = nstring(0,name) - nstring(0,"eroFirst"); name == string("XSecond");
A ** 3 = AAA
>>571 まともな人間は、交換法則のことだけをさして「可換」とは言わない。
と言う訳で、次は結合法則の話題が続きます
>>575 それだと
string str = "FirSecondst-First";
str - nstring(0,"First") - nstring(0,"Second") != str - nstring(0,"Second") - nstring(0,"First");
になって一致しないだろ。やりなおし。
>>551 {'h'*'w', 'e'*'o', ...}
そろそろスレ違いな感じもするが、 こういう話題は好きなのでそういうスレがあれば誰か教えてくれ
多くの人々がだいぶ前に通過した場所だけどな。 根本は+の意味を数学的な加算に限定するか一般的な追加にまで拡張するかという思想の違い。
ベクトルを考えたときに、加算と連結は別の演算子として欲しいってのは当たり前と思うが。 兼ねてるほうが異常。
できれば数学と同じテンプレートが使えるようにしたいけどね。
*が外積なのか内積なのか分かりにくいので、・と×を導入してください pythonの for i in range(a,b): は for i in [a,b) になります 代入は:=、比較は=くらいは言語によっては実施されてるか
ベクトルの連結を数学っぽく書くと(a b)になるのかな
a | b
腐れ数学オタのこだわりとか心底どうでもいい
>>586 そこまでやるんならinじゃなくて
i <- [a, b)
と書きたいな
内包表記はPythonよりHaskellのが断然いい
591 :
デフォルトの名無しさん :2011/05/26(木) 01:31:13.64
数学ヲタがキモイから、中置記法は全廃して、全て前置記法にするのが合理的だ。
a->b[c] += d を (set! (aref (slot-ref a b) c) (+ (aref (slot-ref a b) c) d)) とか書きたいんですよね、わかります
Python の 3 <= n < 10 みたいな書き方は正直羨ましい。
lispは生産性の点でちょっと…
>>594 みたいな書き方は数学的だけど関数言語的じゃないし
そもそも数学って手続き的だし
純粋数学は別にいいんだけど、 実際にそれを使って証明だアルゴリズムだとなると、どうしても手続き的な使い方になるので プログラミングとなると、さらにそういう側面が増えるし
タダのシンタックスシュガーだろ。難しく考えすぎ。
証明って手続き的か?
たとえば数学的帰納法が近いのは手続き的なループじゃなくて
関数的な再帰とパターンマッチだろうし
ニュートン法みたいな奴も、数学的に定式化する場合は要は漸化式じゃないの?
手続きといえば代入で
x = x + 1
なんだけど、これはメモリセルから値をとって1を足し、元の
メモリセルに代入するという数学的には意味のないことをやってるけど
しかしそれが手続き的プログラミングにおいては本質的
正直
>>595 や
>>575 が何を言ってるのか俺もよくわからない
Lispが生産性云々も、Lisperから見たらC++erがそれを言うのか?って感じだぞw
>>597 アルゴリズムって関数型言語の十八番な訳で、そこを否定して手続き的と言われてもな。。。
最近、数学ガール ゲーデルの不完全性定理を読み終わったんだが、そこに出て来た論理体系がhaskellにそっくりでビビったぞ
多分想定してる分野が違う気がする 数学と言っても広い
>>577 まともな人間は今話している内容を考慮して
単語の意味を考えることができる。
それができないお前がバグ。
>>587 を採用すると、
(string("Hello ") string("world!")) == string("Hello world!")
になるのか。
元々文字列リテラルの併記は結合されるし、C++には合ってるかもな。
で、オーバーロードしたいときはoperator ???……なんて書けばいいんだ?
>>603 std::string operator,(std::string const&, std::string const&);
auto helloworld = (std::string("hello "), std::string("world"));
コンマ演算子は確かにそれっぽいな オーバーロードできないけど
->*演算子の出番のようだな
.*もあるな
std::string operator()(std::string const&, std::string const&); auto helloworld = std::string("hello")("world")("!");
609 :
デフォルトの名無しさん :2011/05/26(木) 21:16:37.33
そんな変態用法、イラン
>>605 コンマはオーバーロードできるよ。
&& や || ができるんだから当然。
マクロ+コンマ演算子オーバーロードによる可変長引数的変態関数
( eval,( output,( concat,"Hello"," ","World" ) ) );
613 :
デフォルトの名無しさん :2011/05/27(金) 00:43:26.90
やっぱりカンマは要らないな
そもそも関数型言語なら本質的にリスト作成以外の目的で括弧いらんだろ
それはないだろ
引数の数が固定なら構文解釈の結果は一意に定まるだろ
中置演算子の優先順位とか
>>594 便利さはわかるけど、冷静に考えたら、
曖昧卓。
そう感じるのはC脳だからか?
operator overloadで、 x < y < z をうまくユーザ定義できる方法があるなら取り込んでもいいと思う。 アドホックな導入ならいらない。
>>618 そもそも文と式の使い方や暗黙的型変換がCとPythonじゃ違いすぎるからなあ
>>619 Python にも operator overload はあるから、問題はそっちよりも
C言語や過去のC++言語と互換性。構文レベルで全く違う意味に
なっちゃうからな。
C++ の a < b < c は (a < b) < c の意味だけど、 Python の a < b < c は
(a < b) && (b < c) の意味(ただし、bが評価されるのは1回)
rangeの概念を一般化して取り入れるべきだと考えている人もいるようだから あるいはc++でもそのうちこんな記述が・・・ [n] & [3,10)
[,)を認めると、構文解析器が悲鳴を挙げないか?
operator<(int,int)とかoperator*(T*)とかの再定義の話になるからなあ
>>621 > 構文レベルで全く違う意味になっちゃうからな。
( ゚д゚)ポカーン
構文レベルで意味…
おーぶんってライブラリがRange関係の機構を扱ってるらしい。 ライブラリでどうにかなるならライブラリでいいじゃない。
a < b < c が operator<( operator<(a, b), c ) でなく operator<(a, b) && operator<(b, c) と解釈されたら困るコードってあるかなぁ…。 すでに a < b < c を数学の意味になるよう工夫したコード書いてる人がいたら困るか。 今から deprecate して20年後くらいに auto さんみたく生まれ変わらせるのはありかも
>>621 リスプ
(< a b c)
c++ もこうしてしまえばww
<(a b c)
Pythonだと a < b > c とも書けるみたいだから、
>>628 みたいにはいかないよね。
(a < c < b に置き換えられたら別の意味になっちゃうし)
ライブラリとかじゃなくて言語が頑張るような機能じゃないかなと思う。
>>629 > Pythonだと a < b > c とも書けるみたいだから、
ぶっちゃけ、これはあり得ない局面ではないがいらんだろ。
a < b > c はなんかおかしい
すなおにb > max(a,c)って書けよと
if (o<O>o)
634 :
デフォルトの名無しさん :2011/05/28(土) 17:36:10.62
もう、変態的なコード止めてくれる?
a < b > c はテンプレートで困るん
Pythonの__cmp__みないのがないと無理
__nlp__
>>625 構文解析と意味解析は分離できるのが理想だが
C++の変態構文ではとてもじゃないが分離不可能
>>639 そういやそれってよく聞くけどどこら辺が面倒なの?
未だによくわからないんだが…
WalterタンがC++が変態過ぎて辟易して 構文解析と意味解析が完全に分離されたD言語作った程
>>641 それ、C++0xだとエラーにならない?
n3290.pdfもn3291.pdfもみれなくなってしまった
n3291は持ってるからどうでもいい
へぇ。ローカルに確保しといて正解だった。
直列化って何で規格に入らないんだ? ちょっとした通信したいときにめんどい。
>>648 ちょっとした用途ならboost::serializationが便利
いやいやいやそういう話じゃない
standard-layoutが規格化されてるからそれで充分だろ 通信は自分でやれ
パディングが入って32bitと64bitで互換がない、 またコンパイラによっても互換が無いので却下。 パディングをパックしろっつうのも目先しか 見えてないアホがやる事なので却下。
つalignas
stdint.h
C with Classesのころのシンプルさに戻して欲しい
だから、自分の使えない機能は使わなければいいだけ。
馬鹿が使いたがるのが困るんだって
そういうジャップはEmbedded C++でもシコシコ作ってろ
C with の時点ですでにシンプルではない
むしろrange based forとかnullptrやstrong enumは馬鹿こそ使うべきなんだけどな
シンプルだよねぇ
C++は馬鹿ホイホイ
strong enumさんとinitializer_listさん早く来ないかなー。
unique_ptr や shared_ptr のように null_ptr にしてほしかった
initializer_listを受け取るコンストラクタはexplicit指定外すべき? hoge h = {...}; explicitにすると↑が出来なくなって無意味化するよね?
hoge h{...}; って書けばいいよ
キモイ
キモナイ
本の虫の人が出す本が、Ray Lischner の C++ in a Nutshell を越えることを期待している 詳説C++ の第3版出ないかな C++ in a Nutshell の0x対応版も出てほしい
C++0x本って出るのいつなんだ?
常識的に考えればまずは規格が正式に固まってからだろ
672 :
デフォルトの名無しさん :2011/06/05(日) 15:04:04.90
つまらない常識だな。 実務でリファレンスとして使うならそれでいいが、 今後どうなるかを知るための策定中規格の解説書にも需要はあると思うけどな。
もうFDISだから固まったようなもんだろ
conceptドコー
お星様になったんだよ
concept に根を下ろし template と共に生きよう auto と共に冬を越え decltype と共に春を歌おう どんなに恐ろしい構文を持っても たくさんの可哀想な委員会を操っても コンパイラから離れては生きられないのよ
concept は滅びぬ!何度でもよみがえるさ! # 実際、今回の規格が発行したら、すぐに再燃するだろうな
ジェネリックは滅びぬ、何度でもよみがえるさ、抽象化の力こそ人類の夢だからだ!!
コンセプトマップ使えば、 int i = int.parse("0xff"); みたいに書けるようになってほしい。
知らんけど Ruby みたい
組み込み型にメンバ関数持たせたり継承できたりするのはキモイ LL厨やOO厨が何と言おうとキモイもんはキモイ
682 :
デフォルトの名無しさん :2011/06/05(日) 17:30:09.34
組込み型だけが何か特殊な性質を持つ方がキモイわ
組み込み型は現実に特殊なんだよ intは数値を表すバイト列そのものであるべきであって、間違ってもvtblなんか持っちゃいけないんだよ VM持ちの言語ならそれでもいいのかもしれないけどCやC++では絶対ダメ
684 :
デフォルトの名無しさん :2011/06/05(日) 17:45:13.27
べつにint自体には影響ないから問題ないだろ
int* p = new DerivedTypeFromInt(); delete p; // あぼーん int に vtable を持たせないとこうなる でも derivable<int> みたいな感じで int とまったく同じに使えるのに継承可能なテンプレートは欲しい 少なくともコンパイルタイム有理数とかよりは需要あると思う
そもそもintは継承できないだろ
>>687 intが継承できないのは vtable 持たせられないからだ、というレスに
int には影響ないからいい、というレスがついていたので、
いや、int に影響を与えないとまともに継承できないじゃないか、というレスをつけた。
>>686 > でも derivable<int> みたいな感じで int とまったく同じに使えるのに継承可能なテンプレートは欲しい
> 少なくともコンパイルタイム有理数とかよりは需要あると思う
はあ?
言いたいことはわかるけどな こんなのがしたいんだろ class SafeInt : derivable<int> { SafeInt operator+(SafeInt lhs, SafeInt rhs){ long result = (long)lhs.get()+(long)rhs.get(); if(result<INT_MIN || INT_MAX<result) throw std::overflow_error(); return (SafeInt)(int)result; } } あまりいいやり方とは思えない
>>686 ?
仮想メンバーを一切持たないオブジェクトも問題なくdeleteできるんだけど。
できねえよ お前は何を言ってるんだ
>>691 はvtblがないオブジェクトとは言ってないからdelete出来る
論点はずれてる
>686 スライシングを避けるためには参照かポインタで持たなきゃいけないけど、 組込み型を参照とかポインタで持つことはほとんど無いからメリット無いんじゃね?
>>694 いや、組み込み型をポインタで持ちたいんじゃなくて
クラスのオブジェクトを組み込み型のポインタに入れたいんだよ。
でないと継承する意味ないよね。
何にせよ仮想デストラクタのない型でやる事じゃないわ 恐ろしすぎる
intのデストラクタをprotectedにしようぜ!
継承せずに使わせてよ
拡張メソッドみたいなのじゃだめなのか
そもそも「.」の左側と右側を区別する必要があるのかどうか
>>695 vtableを持たない親classのポインタに子を入れても、
親classのポインタをdeleteしなけりゃ別に問題ない。
てか、親classのポインタでdeleteするヤツいる?
個人的には全くといっていいほどしたこと無いけど。
そらもういくらでも
スライシングとかdeleteミスとかはshared_ptrで回避できるのにな。 >682 単に組込み型をラップするクラスを用意してそっちを使えば良いと思うけどな。
int相手にdynamic deleterとか嫌だよ
conceptは無駄にプログラムが長くなるだけ コンパイルエラーが出たらクラスの定義見ればいいし
>>706 > conceptは無駄にプログラムが長くなるだけ
全く逆
ムーヴコンストラクタはデフォルト指定出来るのにムーヴ代入はできないのか? 中途半端やなぁ…
できるぞ。
711 :
デフォルトの名無しさん :2011/06/11(土) 17:12:53.41
で、行列の積の問題は、moveで解決できるのでしょうか?
この人か
正直何を言ってるのかわからん
138+1 デフォルトの名無しさん 2010/04/02(金) 21:48:36
右辺値参照を用いて(a+b)*(c+d)*e のような行列の積を正しく計算
できますか?
a *= bの行列演算では、裏側で一時オブジェクトを導入しない限り
正しい計算結果は得られないはずですが( a += bとはわけが違う )、
右辺値参照でもこれと同じような事は起きませんか?
「いや、C=prod(A,B)のような使い方しか想定してない。」と言うのなら
仕方ないですが。
※「右辺値参照」の右辺値という言葉はかえってわかりにくいと思うの
ですが、皆さんはどうですか?
140 デフォルトの名無しさん sage 2010/04/02(金) 23:49:29
>>138 何言ってるのかわからん。 >139 はエスパーか?
右項が正方行列な積の一次オブジェクトは左項の1行分だけ確保すれば十分なので
右辺値参照使うならそういう対処ができる
右項が長方行列な積であれば左項と結果のサイズが変わるので
結果は新しいオブジェクトを作るしかないが
その結果と足し算をするとか言う場合のために右辺値参照を返すのには価値はある
このくらいの事しか言えない
つまり、無理矢理右辺値参照を使うことは出来るが、効率的に意味がない、 という理解でよろしいでしょうか?
まず「行列の積の問題」とやらを明確にしてください
一時オブジェクトの使用と右辺値参照はなんの関連もなく 右辺値参照を使うなら一時オブジェクトを使ってはいけないなんてことはあるはずもないんだが。 行列クラスMのa*=bの実装は M tmp(a); a=tmp*b; とか M tmp; tmp=a*b; swap(a,tmp); とかの形になるだろうがどちらもmoveの導入で効率をよくできる。
ん?右辺値参照って、原則無名のオブジェクトを参照している事を保証してる参照じゃねぇの?
いや、代入/コピーの右辺値の意味をユーザ定義できる機構。
そういやそうか、 std::string &&value = std::string("これやると危険だもんな"); typeA a = value;//valueが破壊される typeB a = value;//おそらくセグフォ
無制限に無名オブジェクトを取れる訳じゃなく、 引数に取れる場合しか使えないって事だろ。
>>718 その定義だとvalueは右辺値を参照する左辺値だからvalueは破壊されない。
というか右辺値参照を思いっきり勘違いしてる気が。
そんなに右辺値参照の基本部分って難しいかねぇ?
3行で
変数に 割り当てられていない 値
「割り当てる」って代入のこと?
この世界で"割り当てる"のはメモリ(領域)だろ
対象となる目的語を聞いているのではなく、動詞の意味を聞いているのだけど。 「変数に(メモリ(領域)を)割り当てられない」とは、C++で具体的にどういう操作ができないということ? 「変数へ代入できない」とは別の意味?
>>727 ちゃんと読めよ。
「割り当てられていない」であって
「割り当てられない」ではないぞ。
了解。 つまり、 「変数に(メモリ(領域)を)割り当てられていない値」 が 右辺値参照 ということだね。
変数に束縛されていない値と言うべきかな
それは右辺値参照ではなく右辺値の説明では
732 :
718 :2011/06/12(日) 19:17:19.13
Self &Self::operator = (Self &&source) { delete[] this.array; this.array = source.array; source.array = 0;//これが可能なのが右辺値って事じゃねぇの? return *this; } sourceに渡された値は今後他に使用されない事が建前的に保証されてる。 sourceに渡される値は演算子の結果若しくは、関数の戻り値のみ。
std::moveの事もたまには思い出してやってください
> source.array = 0;//これが可能なのが右辺値って事じゃねぇの? 可能不可能でいうなら左辺値をconstでない普通の参照で受けても出来るけど。
右辺値参照って、要するに一時オブジェクトを束縛して、 消え行くオブジェクトのオーバーヘッドを減らして効率上げる機構だよね??? 関数とかで返却されるオブジェクトのディープコピーよりももっと手数を短くしたいっていう欲求というか。。。
737 :
735 :2011/06/12(日) 20:52:37.93
うそん。これだけだと・・・。 あと何があるのかなぁ???
右辺値参照は、右辺値の振る舞いを自由に定義できるローレベル機構。
あるオブジェクトが右辺値参照される回数をカウントしてログ取るだけでもいいし、
smart pointerのよりエレガントな実装に使ってもいい。
C++は
>>735 のような用途限定の機構は規格には入らない。
>>738 そりゃ屁理屈だろ。
別にthrowはif & dynamic_cast代わりにつかえるつってんのとかわんねぇじゃん。
そりゃ使えるだろよ。
ビットシフト演算子をストリームにとかあるし・・・
741 :
デフォルトの名無しさん :2011/06/13(月) 00:31:32.26
右辺値参照はもともとはmove(の概念)を汎用的で問題が起きにくい形で実装・使用できるように導入された仕組みだろ。 もちろんそれ以外の用途で使ってもかまわないが。 1 条件によってはmoveはcopyよりも効率的だというのは以前から知られていた。 2 より広い範囲でmoveを使えるようにmoveの実装・使用を助ける仕組みを規格として導入したいが ・既存のコードに影響せず ・できれば現在の仕様と親和性のある形の ・意図しないmoveが発生しない ような仕組みを導入したい。 3 そうだ右辺値ならたとえ意図せずmoveされてもほとんどの場合問題にならない。 右辺値のみを受け付けるインターフェイスを作ってそこを介した時だけmoveするようにしよう。 4 右辺値参照誕生。 5 少しあったがやはり左辺値を右辺値として扱える仕組みも必要だ。 6 std::moveやstd::forward誕生。
>>741 この問題は、その箇条書きで言えば3.が早い段階で議論されて、
その後、moveとforwardが議論されだしたって流れ。
もちろんconstベースのmove, forward最適化の議論はそれ以前からあったけど。
具体的に言えば、n1188でbindでreferenceを避けるために禿が&&を導入、
n1377でmove, n1385でforwardingに、あの&&使えるじゃん!となった。
これはJohn Spicerが思いついたらしい。
http://std.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#106 辺りを経由。
だからmoveしたいがために&&が検討されたってのは歴史的経緯としては間違い。
&&をmoveばかりで考えるのも、仕様の理解を妨げる。move脳になってしまう。
lvalueとrvalueで話がされてるけど、この概念も拡張されたんだよね?
そういやxvalueとか居たなぁ。
右辺値参照がlvalueとrvalueの相の子のような妙な代物になってしまったので 専用の名前(xvalue)を作って整理しただけで別に新しいことはないよ
int value; const int &xvalue = function(); int &prvalue = value; こういうことか。
effective 0xが出るまでは安心して使えないと思う
749 :
デフォルトの名無しさん :2011/06/14(火) 21:54:05.98
>>733 えっ? move終わったの?
そもそも、いつのまにforwardなるものが・・・
いつまで考えてるつもりなの? シェアなくなるまで?
??
いつISになるのかって話なら、3月にFDISが承認されたから今年の夏ごろ発行される予定と聞いたが
754 :
デフォルトの名無しさん :2011/06/15(水) 09:47:25.40
u"ってしてるから
理屈の上ではそうですが実際は違うくないですか?
実際って具体的に何のどこを指しているんだ
>>755 野家が漢字でかまわないのは今まで通り。
(コンパイラがソースのキャラクターセットに対応している限り)
\U00020BB7 は\uffff より大きいことからわかるように
(多分)下の棒が長い吉。SJISのソースには書けないからエスケープされてる。
んでお前らは0x仕事で使えるようになった?
その前にC99を使えるようにしてください
autoとラムダ式とスマートポインタとarrayくらいだな。
関数型言語見切った 一人で作るならC++最強だな
nullptr、= default、= delete、スマートポインタは読みやすくなりそうだけど autoとかはどのくらいの目安で使えばいいのか迷う
for (auto itr = hoge.begin(); ... )
auto i=3;じゃなくて、いきなりi=3;とか書ければいいのに
それはもう別物だろう 変数の宣言が必要のない言語なんてあるのか?
lua
Haskell
autoって書くのはLuaでlocalと書いたりHaskellでletと書いたりするのと同じじゃね まあPythonあたりだとなんも無いけど、そのかわり関数スコープで ブロックスコープ相当の機能はないし 上位スコープの変数を更新するのにいちいちglobal文やnonlocal文が必要だし 既存の変数を書き換えるつもりでtypoしても処理系はエラーを検出できないよ
for (const auto x : { 1,3,5,7,11 }) cout << x << '\n';
いや、C++にautoはあっていいけど、
>>768 みたいに言われるとね
とりあえず、型名にテンプレートが入ったら迷わず auto って感じだな。 ラムダ式の仮引数に auto が使えないのは残念。 std::vector<std::shared_ptr<hoge>> v; (略) std::sort(v.begin(), v.end(), [&](const auto &lhs, const auto &rhs) { ... }); こういう書き方が出来ればいいのに。
むしろ、こうしたい。 v.sort([&](const auto &lhs, const auto &rhs) { ... });
decltypeも結構長くなるな decltype(v)::value_type decltype(*v.end()) decltype(v.back()) decltype(v[0]) std::sort(v.begin(), v.end(), [&](const decltype(v)::value_type &lhs, const decltype(v)::value_type &rhs) { ... });
マクロでも使えば?
もしvの型がベクターの参照で宣言されていたら
参照型から元の型に変換する型関数書いてそれを適用したものをdecltype
decltypeってキーワード長過ぎ
__tぐらいにしてくれ
#define ty decltype
perlでやれ
キーワードでなく、メンバにしてしまえばいいのさ v.type みたいに
るびーみたいだな あれは動的にやってるから解釈は簡単だけどそういうのをコンパイル時にするとなると一体どうなるのか Dみたいにコンパイル時インタプリタ走らせてみるか?w
C++テンプレートもチューリング完全ですよ。
誤爆
constexprがある以上、C++もコンパイル時インタプリタは走ってるはずw
めんどくさいから, もう()だらけのポーランド記法でいいよぉwwW
コンパイル時インタプリタに相当するものを走らせないといけない最たる場面ってSFINAEじゃ? constexprよりもSFINAEのほうが面倒見なければいけない範囲が圧倒的に広い
なにいってんだお前は。 SFINAEがなければ、単にコンパイルエラーになるだけだ。
substitution failure の判定にコンパイル時インタプリタ相当のものが必要になるのでは? ただし計算しなければいけないのは syntax の受理・不受理だけになるとは思いますけれど.
コマンドの出力をそのままインクルードできれば簡単なのに
Makeでやれと言われそう
>>794 何のインタープリタと主張してますか?
C++のインタープリタじゃないですよね?
>>797 あー,インタプリタという言葉を使うのは完全にまずいですね.すいません.
C++ のメタコンパイラ(?)とでも呼べるような機構が
substitution failure の判定のために走っている,ぐらいの表現になるかと思います.
お前の独自用語だと、文法エラーや意味エラーを判定するのは全部メタコンパイラだな。
議論するなら使う単語の定義の認識合わせしないと
新しい言語には NullPointerException を言語レベルでサポートして欲しい 出るたびに 「ぬるぽ」 と口に出してほくそ笑むのに必要
throw nullptr; 胸が熱くなるな
void *でcatch出来るのかな
>>802 手が滑ってヌルッとウナギみたいにすり抜けそう
ぬるっと滑ったらぽっと落ちる
>>803 キーワード nullptr は、std::nullptr_t 型の prvalue だと定義されて
いるみたいです。(FDISの2.14.7、46頁参照)
なので、もし本当に nullptr を投げるつもりなら
try {
throw nullptr;
} catch ( std::nullptr_t e ) {
...
}
みたいな感じ?誰も投げないと思うけど。。
try { throw nullptr; } catch ( std::nullptr_t gatt ) { ... }
捕まえても変数に対して出来ることが無いな catch ( std::nullptr_t )
std::nullptr_tってクラスかもしれないだろ
nullptrを捕まえられれば本望
普通にそれで動くで
segvをキャッチしたいって話じゃなかったっけ……?
つまらない奴だな
unionに普通のクラスとか載せれる(コンストラクタは勝手に走らない)ようになったってことは template <class Foo> union Bar { Foo foo; }; これだけでFooの為のアラインドストレージになるってこと?
unionはアラインの保証なんかしないぞ。 アラインされたストレージが欲しければ、そのまんまの名前のaligned_storageがある。 ちなみに、アラインされたunionが欲しければ、これまたそのまんまの名前のaligned_unionがある。 単にクラスや変数のアラインを指定したいならalignasを使え。
unionってすべてのメンバに対してアラインが取れてる仕様じゃなかったっけ? 0xで変更になったの?
ぬるぽっぽ
>>817 > アラインされたストレージが欲しければ、そのまんまの名前のaligned_storageがある。
↑↑↑ハッアアアァアアア???????????
本当にバカだな
なんだ、ただのゴミか
>>818 で、これは結局どうなんですか?
このスレにはこんなことにも答えられない素人しかいないんですかね?
そんな人たちの一人が本を書こうとしてるなんて世も末ですね
夏休みはじまった
union A { std::string s; ... }; A a; A は standard layout でないから、 (void*)&a != (void*)&a.s (void*)&a.s は std::string のアラインを守っている必要があるけど (void*)&a はどうなっててもいい。 これで満足かい?
番号も書かずに規格を語るな
最初からこんな所に頼らず てめえで仕様読めよ
敗北宣言乙
脱北宣言に見えた
俺は脱糞宣言に見えた
829 :
デフォルトの名無しさん :2011/07/03(日) 01:29:39.32
0xってhash_setとhash_map入るんだっけ? そうなると、そのhash_setとhash_mapのiteratorの扱いはどうなるの? 1.iteratorの順序は? 2.eraseした時、erase対象以外の要素を指してるiteratorは無効になるの? (hash tableは、要素を削除したとき、他の同一hashの要素で削除部分を埋める 実装が可能なため)
unorder_setとunorder_mapな 1. その名の通りbegin()からend()まで走れば全部舐めること以外は実装定義 2. ならない
てかそもそも削除できるのか? どうやって対象の要素を空にする?
とりあえずhashをこんな感じで考えていたがアカンで。 iterato保証すると、追加と削除と探索が遅くなるで。 template<class Type> size_t Hash(const Type&); template<class Type> class HashSet { std::vector<Type> array; HashSet<Type> *table; public: class iterator; HashSet(size_t size):table(size){} virtual ~HashSet(void){delete table;} iterator insert(Type &object) { size_t offset = Hash( object ) % table.size(); if( !array[ offset ] ) { array[ offset ] = object; } else if( object != array[ offset ] ) { if( table ) table = new Table(); table->insert( object ); } return iterator(this); } //略 };
erase
普通vector<list<T>>じゃないの?
普通vector<set<T>>かvector<map<T>>だろ listとかあほか
>>835 unorderの実装なのにsetやmap使ってどーすんだよ
え?
もうやだこいつ
>>836 ハッシュテーブル使ってるからunorderedなんだろ
operator <(less<T>かも)を要求されないからunorderだろーが
アドレスの比較で十分
え?
>>840 それで実際にinsert書いてみろよ……
右辺値参照が静的な参照カウントで実装されてるとすると 外部由来のポインタもってるクラスの扱いはどうなるんだろう?
>>844 どうして守れないと思うのかが分からない
右辺値参照を誤解してるみなさんへ 8.3.2-2 Lvalue references and rvalue references are distinct types. Except where explicitly noted, they are semantically equivalent ... 左辺値参照と右辺値参照は違う型だが、 明示的に注釈される箇所を除いて、意味的には変わらない 意味的には変わらない。右辺値参照は左辺値参照とまったく同じ実装になる。 じゃあ明示的に注釈される違いとは何か。 8.5.3-5 (要約) ・lvalue は、左辺値参照を初期化できる ・xvalue と prvalue は const左辺値参照か、もしくは右辺値参照を初期化できる では lvalue, xvalue, prvalue とは何か。 prvalue: 5.1.1-1 A string literal is an lvalue; all other literals are prvalues. 文字列リテラル以外のリテラルは、prvalue。 xvalue, lvalue: 5-6 (要約) ・戻り値が右辺値参照の関数を呼び出した結果は xvalue ・右辺値参照にキャストした結果は xvalue つまり「無名の」右辺値参照は xvalue。 それ以外はすべて lvalue。 右辺値参照の変数は、変数名がついているのでもちろん lvalue 上記の部分をまず理解してからでないと 何を言っても意味不明だよ。
ばかにしないでくれる そのくらい知ってるわよ
AA忘れてるぞ
内容は正しいけど投下するタイミングを完全に間違ってるな
851 :
847 :2011/07/04(月) 17:16:32.26
えぞえさんの記事張ればいいじゃん
本人じゃね
>>846 setやmapの要素は削除するとiterator無効になるじゃん。
そんな当たり前のこと言われても困りんす
>>854 はつみみです
木の実装から考えて、無効にするほうが難しいと思うが・・・
>>856 何を言ってるんだおまえは
試してみろよ
実物のunordered実装の一つではdeque<slist<T>>(相当)を使ってたな
>>856 回転とか二重回転でぐぐってみろよ
木の再構成がどんなに複雑な過程かよく分かるから
結局削除後のiteratorを保証するには、衝突をlist相当のものにするしか無いのか。 衝突の度にnewだろ、なんか遅そうだな。
何がsetやmapの要素は削除するとiterator無効になるからlistにしろだよ。 なわけねーだろ。最近レベル低いやつ多すぎ。
それとは別にわざわざunordered_mapでmapを使う意味もわからねーけど。
>>862 setやmapのイテレータの指す要素を削除すると確かにそのイテレータは
無効になるが、イテレータを削除前にインクリメントして次の要素を指すように
しておけばそのまま使える
例えば次の通り
const int N = 100;
int main()
{
std::set<int> si;
std::srand(static_cast<unsigned>(std::time(0)));
for (int i = 0; i < N; i++)
si.insert(std::rand());
std::set<int>::iterator pos = si.begin(), tmp;
while (true) {
tmp = ++pos;
if (tmp == si.end())
break;
if (*pos % 2) // 奇数
si.erase(pos);
pos = tmp;
}
std::copy(si.begin(), si.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
>>864 うんそのとおり。俺もそのつもりで書いてるんだけど何が言いたいの?
それとコードの肝心な所が間違ってるぞ。
iterator無効云々の話が関係あるのか?
unordered_mapの実装にmapが使えない理由は
>>839 だろ
>866 operator < が無くてもmapに入れようと思えば入れ子にすることで入る。ただ本当に何のメリットもなくなるけど。 そもそもunordered_map自体hashの衝突が多くなってきたらhash tableを拡張することで性能を維持しようとするので backetにmapを使っても重いだけ。
mapを使用するメリットがあるくらいhash衝突が多いなら計算量はO(logN)になり、 unordered_mapの特徴であるO(1)のアクセスが出来ないことになる
でもmapを使ってもバランスの取れるところはあるか・・・
やっぱり
>>839 が理由なのか
>>867 >入れ子
ハッシュ値をキーにするとかそんなか
>>870 うん。
「何のメリットもなくなる」と書いたのは同じbacket内なら全部hash同じだと考えたんだけど
よく考えれば別のhash関数を噛ませればばらけてくれるのでそんなことは無かった。
ハッシュ関数2つ通して、しかも両方が衝突したときのためにmultimapにして最後はop =で……とか考えると オーダーの定数項部分が洒落にならん気もするしメモリも喰うだろうしで 普通に一番外側のテーブルを大きめに取ったほうがいいだろうな
>>859 まさか、削除したiterator自身が無効になるぜとか言ってんのか・・・?
当たり前だろ
今問題になってんのは削除されなかった要素を指しているiteratorが無効になるかどうかだろ
ハッシュテーブル大きすぎてもメモリ食うし たまたま衝突多かったらパフォーマンスがO(N)にだだ下がりってのもどうなのよ >list
つーてもハッシュ関数ふたつ用意させるぐらいなら 最初から1種類のハッシュ関数の質を高めろよって話だしなあ 何重にしたところで全部衝突する可能性が残る以上必ず末端はlistになるんだし
23.2.4-9
...and the erase members shall invalidate only iterators and
references to the erased elements.
とあるから、map のイテレータも、eraseした奴以外は有効のままだよ。
ただ、枝の付け替えを行うから
>>864 みたくすると多分走査漏れがあったり、
二重に走査してしまったりすると思う。
せっかく erase(q) は消去した次のメンバを返すのだから
それを利用したほうがいい。
規格上どうなってるか知らないけど素直に赤黒木を実装すれば走査漏れや二重走査は無いよ。 新しく挿入した要素が走査途中の要素より後ろにあれば走査されないけど。
>>877 木の構造が変わるから、左子ノードだけ操作したノードスタックが無効になり、
上位ノードに戻るのが容易ではない。
>>876 >
>>864 みたくすると多分走査漏れがあったり、
>二重に走査してしまったりすると思う。
ちょっとこれ困るんですけど
eraseした先が無効になる以外は問題ないという事を前提にして
書かれたプログラムがたくさんある
C++0xが関係のない、かなり初歩的な事まで話題になり始めてるから、 アルゴリズムスレに移ったほうがいいと思う。 ちなみに並列安全なイタレータの分野では、C++はかなり遅れを取っています。 (捜査漏れがない、二重捜査しない、順序が狂わない、オーダなど) やっぱりGCのある言語のほうがずっと簡単なんで。
881 :
876 :2011/07/05(火) 14:46:02.84
>>877-879 すまん。確かに
>>877 の言う通りで、
map は「順序を保持した」木なのだから
枝を複雑に付け替えて木の構造が変わっても
あるノードの「次の」要素は絶対変わらない。
だから
>>864 は正しくて、
>>876 の俺のコメントは間違ってる。
>>874 ハッシュテーブルって元々そういうアルゴリズムだし。
STLportがスレッドセーフレベル2だったんだっけ もう過去の遺物だけど コンテナをスレッドセーフにしちゃうとVSみたいに標準関数が軒並み遅くなっちゃいそうだし そのためにわざわざランタイムを2種類用意してたよな VS10からは一本化されてしまったけど
一本化したのはVC8からなんだが
imcomplete type って何? 知ってる人教えてくだしあ
886 :
885 :2011/07/05(火) 22:34:23.42
まちがえた。ごめんなさい s/imcomplete/incomplete/
>>885 不完全型。宣言されているが定義されていない型のこと。
sizeofや実体化、コピー、派生、メンバや内部型へのアクセス等が出来ない。
関数宣言の引数・戻り値型やポインタの要素型、テンプレート引数に使う事は出来る。
888 :
885 :2011/07/06(水) 19:38:36.39
>>887 分かりやすい解説、ありがとうございます。
ところで、新しい規格の話題で、最近スレが寂しい
そこで、ライブラリの使い方などのリクエストを受けて、無知ながらFDISを調べつつ
解説してみようと思うんだが、需要ある?
incomplete typeも自力で調べられない奴がか?
>>882 set/map使えば最悪でもO(logN)で済むじゃん?
ハッシュが被らない場合でも各バケツ内で要素を探すための比較はどうせ行われるのだし、
listにする利点なんて追加のコストがちょっと下がるくらいじゃん?
ふたつめのキーも被ったら結局O(N)になるじゃん?
削除コストも下がるよ。
比較できない要素型だったら内部でordered使ったらコンパイル出来ねーだろうがアホか死ね
採択までずっとこんな流れなのか
>>893 イテレータが既にあるならコスト下がるけど
なければ削除するノードを検索するのにO(N)かかるよ
>>894 比較できなかったらそもそも値取り出せないだろwww
list使おうが要素の探索は必要になるんだぞ
結局アクセスの最悪オーダーをO(logN)に抑えるにはoperator < が必須になる operator < を要求しないunordered_mapで実現するのは不可能。
STLスレに行けよ
901 :
885 :2011/07/07(木) 19:07:28.47
調べました。 3.9p5 で定義されています。incomplete type とは、 宣言されたが定義されないクラス型、 サイズ不明若しくは incomplete type の要素を持つ配列型、 又は void 型 のこと。 具体例は 3.9p6 を参照して下さい: class X; // この時点で X は不完全型 extern X* xp; // xp は不完全型へのポインタ xp++; // ill-formed struct X {}; // この時点で X は完全型 X x; xp = &x; // OK
902 :
デフォルトの名無しさん :2011/07/07(木) 20:53:54.36
OKの位置が変
上のほうで2つ目のハッシュを使って云々ってレスがあるけど、 それなら1つの配列(vector)にオープンアドレス法使えよ、と思う。 もちろん、それだとstd::unordered_の要件を満たせるものは作れないだろうことは分かるけど。
スレ違いも甚だしいが、要求しないのは要件ではない。 unorderedは、orderがあってはいけないことを意味しない。 このくらい理解してないと次期規格どころの騒ぎじゃない。
そりゃあれば使ってもいいけどさ、結局渡されたキーにoperator<が無い版の処理は必要だろう?
あれば使う、なければ使わない、って、 コンセプトさん無くてもできるんだっけ?
テンプレート+ADLあれば可能。
>>905 が何を言いたいのかわからんが。
基本リストにして、ポリスィーでコンテナ切り替えで十分でしょ まあどうせboost使うからstlにはそんなに期待しないでいい
不毛な議論が続いているような気がする
GCC のソース見ながら、1つずつ解釈していった方がずっと建設的では?
ttp://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/files.html 23.2.5-1 に、最悪の場合に線形で、平均的にはそれよりずっと速い、
と書いてあるだけで、logN は見たことがない
それに、750頁の a_uniq.insert(t) も a_eq.insert(t) も同様になっている
一般的な二分探索の logN だけが、一人歩きしているような気がする
アルゴリズムと、今回の規格が混同されているのが、混乱の原因かと
23.5 をさらっと見てみたけど、どこにも operator< は無かったよ
STLスレに行けよw
unorderedだからC++0xでもいいんじゃね
>>907 std::unordered_map は、key の型に operator< が
定義されていなくても使えなくてはいけない。これは要求。
だから std::map が std::unordered_map の定義に紛れ込んではいけない
ということを
>>904 に向けて言ってるんじゃないの?
さらに言うと、 operator< が全順序でないといけない。 でも、テンプレートメタプログラミングでは < が定義されているかどうかは 分かっても、それが全順序かどうかを判別して実装を切り替えることができない。 なので、 unordered_map は全順序 < を要求するか、 < を一切利用しない実装に しないといけない。
全順序じゃ無くてもどっちが大きいかランダムで返すってことでも良いはず
>>914 同じ引数に対してoperator<を適用するたびに結果が変わるならまともに順序があるとは言えない。
一意に定まるなら自動的に全順序が成り立つ。
問題は順序付きコンテナが必要とするoperator<の結果は全順序を満たす必要があるのに対し、
コンテナ要素の型Tが例えoperator<を持っていても、全順序である義務は無いということ。
例えばTがexpression templateをサポートしており、operator<はboolでは無い型を返すかもしれない。
そのようなオブジェクトがコンテナに入れられないとなると問題だろう。
>>913 > でも、テンプレートメタプログラミングでは < が定義されているかどうかは
> 分かっても、それが全順序かどうかを判別して実装を切り替えることができない。
現ライブラリでは、の間違い?
TotalOrdering<Op, T>で済む話だよね?
「テンプレートメタプログラミングでは」、
ライブラリ作成者が後から定義できるのが特徴。
Conceptでもっと使いやすくなるはずだったが…
>>915 たとえ一意でもoperator<をテキトーに決めたって全順序にはならんよ
推移律満たすとは限らないんだから
逆に言うと全順序じゃない物を並べられ無いと言うことになるけど 集合に全順序じゃない順序を入れて並べたいときはどうするんだ?
そんなのC++0xの話題なのか? Strict weak orderingも知らん奴は初心者スレに行ってくれ。
やっぱりな全順序なんておかしいと思ってたよ。 Strict weak orderingで十分だとはうすうす思ってたんだよな。
>>917 operator<がboolをtrueとfalseでランダムに返すようにするか
いやいや、全順序(というか整列順序)自体は必要でしょ begin()〜end()の順番はとにかく決めないといけないんだし、同じコンテナのイテレータ同士が比較不能だなんて困る
トポロジカルソートもしらんのかいなヤレヤレ
スレ違いは他所でやれ
トロピカルリゾートくらい知ってるわな
トロピカルランドなら知ってるぜ
もうボゴソートでええやん
FDIS見てみたんだが、イテレータがコンテナの要素を走査する順序は、 23.2.5-6 により規格は指定していないみたい。 ただ、等値キーに対しては、隣り合った走査の順序になると 23.5.4.1-1、23.5.5.1-1、23.5.6.1-1及び23.5.7.1-1 にあるように unordered_* は前進イテレータをサポートするんだってさ
なので、
うう、違うショートカットキーを押してしまった。。すみません
なので
>>922 の言う begin()〜end() の順番は、
処理系によってかなり変わる可能性もあると思う
最悪、hasher の返す size_t 型の値の順序でいいかと
std::vector<char> vec; decltype(vec)::value_type value_type; とするとVC++2010では構文エラーになります。 typedef decltype(vec) vec_type; vec_type::value_type value_type; とすると通ります。 言語仕様的に正しい振る舞いなのでしょうか?
typename decltype(vec)::value_typeってしてみ
decltype(vec)::value_type は割と後になってから可能になった仕様なので VC10ではまだサポートされていない だったと思う
してません
イニシャライザリストさんも動かなかったりするから、もうちょっと待ったほうがいいかも。
VC++はいつだってクソだから
VC++の0x拡張はお勉強以外でつかうなよ。
MSはドラフト段階で取り入れた場合、製品の下位互換優先してFIXしてしまう。 ような気がする
発売日考えてやれよ・・・
Windows開発はMinGW+MSYSで十分すぎる 0xの機能もたくさん使えて楽しいしオプションで切ることもできるのが嬉しい VC++は中途半端だからOFFにしようとしたけどオプションが見当たらなかった
同時期のgccを考えると 明らかにVC++は・・・
そもそもVCはやる気なかったやん
あんな中途半端な対応なのにオプションで外すことも出来ないとかVCないわ
いやC++03はVC++の方が先行してた時もあったよ。 ただMicrosoftとしては、C++0x対応を出してもあまりメリットがない。 あれはあくまでもWindows開発環境用にあるのだから。 Herb Shutterとかいるから、内部的には既にあるのだろうけど。
CLIはもうやる気無いけど C99ガン無視のVCが0xに対応しようとしたあたり いくらか前向きなんじゃないのかね
時期バージョンではC++/CLIのインテリセンス復活させるって話だからやる気はそれなりにありそう
C++/CLIはC++じゃないし… delegate()と干渉してラムダさん使えないし…
VCはC++コンパイラだから、Cの変更には追随しないってスタンスなのかも。
C99って何のために存在するの?
951 :
デフォルトの名無しさん :2011/07/20(水) 04:41:07.44
いらんことしい 減量すべきときにメタボ化しやがった
Microsoft は C99 はスキップして C1X を実装するよ
C++0x*0.75ぐらいがちょうどいい
C++ + (C++0x - C++) * 0.2 くらいがいいな
C++0x はうんこすぎる あんなの使うなら C と ML 使うわ
MLwwwwwwwwwwwwwwwwwwwwwwwww
957 :
デフォルトの名無しさん :2011/07/20(水) 15:17:39.63
C99 の轍は踏まないで欲しいな
コンパイル時リフレクションが欲しいのう
C99は数値計算屋には重要。いい改正だった。
960 :
デフォルトの名無しさん :2011/07/20(水) 17:28:42.28
特定用途にシフトしたってことだな 返す返すも設計思想を曲げた愚かしいことだ
数値計算やってるけど、Fortranならともかくpure C使うメリットが分からないんだけど
俺も数値計算屋やってるけど、Fortran なんて新規に書きたくねぇ restrict がある時点で C99 でもいいやってなった
963 :
デフォルトの名無しさん :2011/07/20(水) 17:38:44.59
狭い視野での最適化を神格化するやつ多いんだよな とかくそういうのは FPGA とか苦手だったりするし 行列の計算がしたいだけなのに FORTRAN とかもう・・・
C89で出来る事が出来なくなったわけでなし、 特定用途にシフトしたってのは違うだろ
965 :
デフォルトの名無しさん :2011/07/20(水) 18:16:07.41
C89 でさえ完全サポートできない(できても非現実的な)環境があるのに そっちを無法状態のまま放置した結果がこのざまだっつーの
実装の強制はできんだろ そんなこともわからないとかアホなの?
C++03はC99の上位互換を目指すべきだった Cと互換性の無いC++になんの価値があろうか 設計思想を曲げたのはC++のほうだな
C99もちょっとC++98に対する配慮が欲しかったな。 C++98に合わせた部分もあるんだけども。 まあ俺は気にせずに両方使ってるよ。
>>965 フリースタンディング環境って知ってる?
C99なんて無視しとけ
972 :
デフォルトの名無しさん :2011/07/20(水) 18:50:04.68
C89のフリースタンディング環境をサポートできない処理系もあるだろうが、 そんなもんC99がどんな仕様だったところで同様にサポートできんだろ どうすりゃ良かったって言うんだ?
974 :
デフォルトの名無しさん :2011/07/20(水) 19:10:27.86
>>973 話の流れ読んでるか? # サポートという言葉が出てきているから見てはいるようだが
おまえの言ってる「C99 がどんな仕様」てのは、現状の C99 を前提とした循環論法だろ
>>974 現状のC99は無視して良いよ
どんな仕様だったら良かったのかと聞いている
boostの行列とfortranの行列計算どっちが速いの?
977 :
デフォルトの名無しさん :2011/07/20(水) 19:25:09.93
>>975 C89 のフリースタンディング環境をサポートできない環境の具体例を1つでも知っていれば
そんな愚問は出るわけがなさそうに思うが、そこまで教えてやる気はないよ
うざい
「そこまで教えてやる気はないよ」(キリッ
>>976 大規模並列計算とかだとfortranじゃないかなあ
>>976 いくらboostでも関数を横断するベクトル命令の管理はできないからなぁ。
引数をベクトルに割り当てたりとか無理臭いし。
Boost.SIMDっていうのが入りそうだよ。中身知らないけど。
>>975 俺なら……もし、C89のフリースタンディング環境をC99でより制限的にしてもいいのなら、受理条件に「浮動小数点型を使用していない」を付け加えるかな
C風無法地帯言語環境には想像をはるかに上回るマジキチC環境もあったりするけどそういうのはCの適用範囲から外したほうがいいような気がする
そういうのには専用の制御言語があるしそっちのほうが楽
C99は各処理系でバラバラに存在してたものをまとめた機能はいいと思うんだけどね
_Boolと_Complexは間違いなくC99の癌だな。あれがなければもっと評価は高かったと思う
>>976 FORTRANコンパイラ(に入ってる行列ライブラリ)の出来による
IntelのFORTRANコンパイラ(に入ってるライブラリ) vs boost(ublas) とかならFORTRANのほうが速いよ
>>982 AVX使いまくりか
Intelから頼まれたのかな
IntelのFORTRAN環境って優秀だったのか まあICCもそれなりに良い評判だし、完成度高いの?
もとはDECのコンパイラだった気がするよ
CとFORTRANの行列の一番の差は行が先か列が先かの違いだけだけど、 Cはよく知られているようにポインタのエイリアスの問題があって最適化が著しく 制限されて速度が落ちる これを避けるためにC99で導入されたのがrestrictで、同じエイリアスではない 事をユーザーがコンパイラに知らせる事でFORTRANと同等の最適化が可能 ではC99が必須かと言うとVCにも__restrictがあったりするし微妙 メインフレームで使うならC99だろうけど どうせライブラリなんてどっちでも動くように再コンパイルされてるし 禿がD&Eで言ってるけど「C++はFORTRANと速度を競うつもりはない」 ので適材適所だな
別にギリギリのところで手間のかかる勝負はしてくれなくてもいいけど、 restrictは既にC99で導入されてる機能なんだから取り入れてくれたって悪くないのにって思う
おまいらC++0xの話をしろよ
じゃあ、0x年代に出せよ。
予言 2012年12月に世界は滅亡の危機にさらされる その時にC++0x計画は破棄される
滅亡しねーよ
世界が滅んでもC++は死なず
次スレ↓
u
m
e
無駄レス連投
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。