C++0x 10
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/06/01(火) 15:58:42http://www.open-std.org/jtc1/sc22/wg21/
Wikipedia
http://ja.wikipedia.org/wiki/C%2B%2B0x
前スレ: C++0x 9
http://pc12.2ch.net/test/read.cgi/tech/1269623636/
0002デフォルトの名無しさん
2010/06/01(火) 16:00:03http://pc11.2ch.net/test/read.cgi/tech/1149440647/
C++0x 2
http://pc11.2ch.net/test/read.cgi/tech/1191842951/
C++0x 3
http://pc11.2ch.net/test/read.cgi/tech/1204808027/
C++0x 4
http://pc11.2ch.net/test/read.cgi/tech/1214407525/
C++0x 5
http://pc12.2ch.net/test/read.cgi/tech/1232460649/
C++0x 6
http://pc12.2ch.net/test/read.cgi/tech/1245092251/
C++0x 7
http://pc12.2ch.net/test/read.cgi/tech/1253280377/
C++0x 8
http://pc12.2ch.net/test/read.cgi/tech/1262874195/
0003デフォルトの名無しさん
2010/06/01(火) 18:10:29校長先生。
0004デフォルトの名無しさん
2010/06/01(火) 19:17:120005デフォルトの名無しさん
2010/06/01(火) 19:49:12○コンセプトさん(幽霊)
かつての痕跡が校内から着々と消されつつあるのを草葉の影で眺めている。
彼女の居た14.10番教室はオバケが出るという噂で閉鎖中。
○ラムダさん
そろそろみんな制服の柄にも慣れたらしく、何も言われなくなってきた。
それどころか、関数さんがラムダさんとお揃いの服を着たいと言いだして物議を醸している。
○右辺値参照さん
ここへ来て急に彼女のせいで校則が変わることになったらしい。
彼女自身はすっかり学園に馴染みつつあるが、聴講生へのイジメが酷くならないか心配している。
○拡張for文さん
服がクリーニングされそうな様子は一向にない。
屋上で「死にたい」と虚ろな目をして呟く様子がよく目撃されている。心配である。
○constexprさん
従姉妹のconstさんと同じく地味な実力派。しかし意外と頭が悪く、単純な話しか理解できない。
「りかーしぶ」の振り回し方次第ではカオスになりかねないので、周りの大人のサポートが大事である。
なぜかstatic_assertさんとは仲が悪い。
○type_traitsさん
最近ますます調子に乗って手が付けられなくなっている。
この間は「私だけで良かったんや!コンセプトなんか最初からいらんかったんや!」と言い放ち
static_assertさんにドロップキックを食らった。
○static_assertさん
暴走するtype_traitsさんとテンプレ部に振り回されて気苦労が絶えない。
姉貴はリリースコンパイルで逃げ出せるからいいよなーと愚痴りつつ仕事を真面目にこなす苦労人。
0006デフォルトの名無しさん
2010/06/01(火) 19:50:04「ねえねえ配列さん、なんでコンストラクタさんと仲良くしないの?」「新入生が来たら仲良くするよ!」
定番と化しつつあるこのやりとりの繰り返しで過剰な期待が勝手に高まりつつある。
本人はあまり何も考えていない。
○テンプレート可変長引数さん
テンプレ部にはすっかり馴染んだが、相変わらず一般生徒からは「あんた何の役に立つの?」
と受けが悪い。最近はもう面倒臭いのでいちいち説明するのをやめた。
○autoさん
苦楽を共にしたregisterさんはついにD組に落第してしまった。
しかし一報を聞いたautoさんの反応は「ふーん、そう」という素っ気ないものだった。
昔の彼女はもういない。
○decltypeさん
一人前の型としての振る舞いも身につけ、いよいよ活躍が期待される所だが、
服の違いで性格が変わる悪癖はまだ直っていない。
いつか必ず問題を起こすと一部の先生からマークされている。
○ユーザー定義リテラルさん
「まだいたのか」と先生に暴言を吐かれ、体育館の陰で泣いていた。
○nullptrさん
誰もNULLさんと見分けが付かないので、既にこっそり通学していると噂されている。
○long longさん
intさんに「ほら!あんたはこっちでしょ!」と間違えて上級生のクラスに連れて行かれた。
○Raw String Literalさん
「お前全然Rawじゃねえじゃん」という状況は、トライグラフさんが譲る形で解決しつつある。
ちなみにトライグラフさんはしぶとく落第を免れ続けてるらしい。
0007デフォルトの名無しさん
2010/06/01(火) 19:51:00コンテナ部とも仲良くできます!あの女とは違うんです!と自分を売り込んでいるが、
みんなのauto_ptrさんのトラウマはなかなか払拭しきれず、苦戦している。
○shared_ptrさん
ライブラリ部が誇るご存じ優等生中の優等生。早く来てくれ。
○unordered_map・unordered_setさん姉妹
名字はhashが良かったが、大人の事情で付けられなかった。
おかげでmap・setさん姉妹との違いをいちいち説明する羽目に。
○Regular expressionさん
Perl学園ではバカにされていたが、ここでは大歓迎。
満更ではないものの、学園の行く末に一抹の不安を抱いている。
○Atomic operationさん
彼女と話していて業を煮やしたとある生徒が「こまけえこたぁいいんだよ!」と叫んで飛び出し
10分後に未定義動作にボコボコにされて帰ってきた。
○threadさん
最大のライバルであるpthreadさんを蹴落とすべく日々努力しているが、
親友のラムダさんがpthreadさんとも親しくなりそうで焦っている。
○System error supportさん
ユーザー定義リテラルさんとよく一緒に弁当を食べている。
○progress_displayたん
System error supportさん達と一緒に弁当を食べようとしたら断られた。
0008デフォルトの名無しさん
2010/06/01(火) 19:51:52他の学校に、かならず一人はいる娘なので、学校側としても、しかたなく、入校させた。
服のセンスが、lambdaさんに負けず劣らず、相当悪い。
lambdaさんと、かぶっている帽子が、見る角度によっては、似ていることがあり、少々問題になっている。
lambdaさんとの区別は、帽子以外で判断すべきだと叫ばれている。
○noexceptちゃん
入学試験の選考の最後になって、急に合格した赤ちゃん。
豪華にも、独自の制服を作ってもらった。
○Inheriting Constructorさん
地味にできる娘。何で今までいなかったのか、不思議に思われている。
○__VA_ARGS__さん
クラス分けで、プリプロセッサ組に通うことになった娘。
プリプロセッサ組は、落ちこぼれだとも、最強だともいわれている、変わったクラス。
その外見はあまりにもブサイクだが、密かにファンもいるらしい。
○exportさん
進級できなかった。
○Exception specificationさん
進級できなかったが、彼女の産んだ、まだ一歳にもならない赤ちゃんが、いきなり入校してきた。
0009デフォルトの名無しさん
2010/06/01(火) 19:52:44type_info君と仲が良いらしい。
噂では、いくとこまでいったとかいってないとか。
ただし、開校前のクラス分けで離ればなれになってしまった。
○System error supportさん
いじめられて転校してきたらしい。
たぶん、どの学校でも相手にされない子。
ほとんどの学校には、学校独自の、もっとマシな子がいるし。
○Tupleさん
博愛平等主義者。ほとんどのクラスメートと仲が良い。
○Binder姉妹(bind1st,bind2nd)
落第。一応、まだ学校にはいる。
○Function template bindさんと、Polymorphic function wrapperさん
二人とも、とても頭が良い。
なんでも、「ぶーすと」という一流の進学校から転校してきたらしい。
あまりに成績が良かったために偏差値を押し上げて、Binder姉妹を落第させる原因をつくった。
○Time utilitieさん
2038年問題も3000年問題も大丈夫と豪語。
○Compile-time rational arithmetic君
Time utilitieさんと仲が良いらしい。
0010デフォルトの名無しさん
2010/06/01(火) 19:58:540xスレ1か2くらいで「直ぐに実装できる」って言われてたのになんでこんな酷い事になってんの?
0011デフォルトの名無しさん
2010/06/01(火) 20:12:360012デフォルトの名無しさん
2010/06/01(火) 20:22:23遠く青森で林檎に囲まれて育ったラムダさんの親戚。帽子が特徴的。
0013デフォルトの名無しさん
2010/06/01(火) 20:37:160014デフォルトの名無しさん
2010/06/01(火) 20:52:57どうせtrigraphあるから、入力できない環境を作る事もないだろうし
0015デフォルトの名無しさん
2010/06/01(火) 20:54:53青森の林檎農家が付属小学校への裏口入学を試みているラムダさんの親戚。
とても気難しく、隣の部屋に行くにも「ぶろっくこぴー」という赤絨毯を要求する箱入り娘。
0016デフォルトの名無しさん
2010/06/02(水) 14:21:460017デフォルトの名無しさん
2010/06/02(水) 15:32:110018デフォルトの名無しさん
2010/06/02(水) 17:23:490019デフォルトの名無しさん
2010/06/02(水) 18:49:240020デフォルトの名無しさん
2010/06/02(水) 19:14:24C++0xのままでおk
C++0x A あたりになるとは俺も思ったのだが
まあどうでもいい
0021デフォルトの名無しさん
2010/06/03(木) 01:14:430022デフォルトの名無しさん
2010/06/03(木) 01:15:580023デフォルトの名無しさん
2010/06/03(木) 10:57:520024デフォルトの名無しさん
2010/06/03(木) 13:48:540025デフォルトの名無しさん
2010/06/03(木) 14:24:12提案があったと思うよ。
0026デフォルトの名無しさん
2010/06/03(木) 18:49:07まあそうだろうな
0027デフォルトの名無しさん
2010/06/04(金) 20:24:320028デフォルトの名無しさん
2010/06/04(金) 20:37:50> クラス分けで、プリプロセッサ組に通うことになった娘。
> プリプロセッサ組は、落ちこぼれだとも、最強だともいわれている、変わったクラス。
> その外見はあまりにもブサイクだが、密かにファンもいるらしい。
そう、これだ。
0029デフォルトの名無しさん
2010/06/04(金) 22:54:31空だって飛べる
0030デフォルトの名無しさん
2010/06/04(金) 22:56:130031デフォルトの名無しさん
2010/06/04(金) 23:53:050032デフォルトの名無しさん
2010/06/05(土) 00:20:58ドラフトをフライング実装してforのスコープ問題みたいなことがまた起こっても困るし。
個人で買いにくい価格設定になっているのはMSの良心かもしれない。
0033デフォルトの名無しさん
2010/06/05(土) 00:21:410034デフォルトの名無しさん
2010/06/05(土) 00:52:110035デフォルトの名無しさん
2010/06/05(土) 01:01:58Express版があるぞ
0036デフォルトの名無しさん
2010/06/05(土) 02:21:260037デフォルトの名無しさん
2010/06/05(土) 02:45:57VC6は使われる時間が長すぎたからな
とりあえずさっさと可変長引数テンプレートサポートしてくれ
0038デフォルトの名無しさん
2010/06/05(土) 07:15:15明らかに実装方法の誤りであっても次Ver.まで仕様で放置とか良くあるんだよな。
0039デフォルトの名無しさん
2010/06/05(土) 07:24:240040デフォルトの名無しさん
2010/06/05(土) 08:47:18そうすればtemplate <class T, size_t N> void func(const T (&a)[N]);で受け取れるし
コンパイル時にサイズもわかるし直にランダムアクセスもできる
なにより組み込みなのにstd名前空間とか気持ち悪い現象が発生しない
0041デフォルトの名無しさん
2010/06/05(土) 09:13:110042デフォルトの名無しさん
2010/06/05(土) 09:15:39サイズの取得が面倒くさい
0043デフォルトの名無しさん
2010/06/05(土) 09:16:06new が失敗すりゃ std::bad_alloc 例外投げるし
それを抑制する時に使うものも std::nothrow だし
0044デフォルトの名無しさん
2010/06/05(土) 10:59:04引数を隠しローカル配列に入れておいて
そのポインタを保持するとか?
0045デフォルトの名無しさん
2010/06/05(土) 12:38:49http://wiki.apache.org/stdcxx/C++0xCompilerSupport
を見たところ、vc++2010はInitializer Lists対応してないね
確かにテンポラリな配列として扱えれば便利だよね
でも↓のような場合はstd::initializer_listがないと困る
// ヘッダファイル
void func(std::initializer_list<int> list);
// ソースファイル
void func(std::initializer_list<int> list) { ... }
と思ったけど仕様とか知らないからこれが可能なのかどうか
分からない
0046デフォルトの名無しさん
2010/06/05(土) 12:43:37このケースなら薄いテンプレートで分離できなくも無い
0047デフォルトの名無しさん
2010/06/05(土) 12:54:49中途半端なことやめて
0048デフォルトの名無しさん
2010/06/05(土) 13:49:36でもそれだけなんだよな
中途半端やなあ
0049デフォルトの名無しさん
2010/06/05(土) 16:26:52FCDには例示されてるけど、後で加筆されたものなのか
0050デフォルトの名無しさん
2010/06/05(土) 19:34:34スイッチで切り替えられるようにしないのはどういうつもりなのかねえ。
0051デフォルトの名無しさん
2010/06/05(土) 21:12:400052デフォルトの名無しさん
2010/06/05(土) 22:21:040053デフォルトの名無しさん
2010/06/05(土) 22:22:01はあ?
0054デフォルトの名無しさん
2010/06/05(土) 23:04:15VC10のC++0xの対応レベルで互換性が問題になるのはautoぐらいじゃね?
0055デフォルトの名無しさん
2010/06/05(土) 23:18:31それ全部使えなくなるってのはちょっと…
まあ、boostの使えば問題ないか
0056デフォルトの名無しさん
2010/06/05(土) 23:21:010057デフォルトの名無しさん
2010/06/05(土) 23:25:20using boost::shared_ptrして使っててstd::tr1::shared_ptrは使ってないつもりなのにstd::tr1::shared_ptrからboost::shared_ptrに変換できませんとか出る。何故なんだろう?
0058デフォルトの名無しさん
2010/06/05(土) 23:35:400059デフォルトの名無しさん
2010/06/05(土) 23:46:110060デフォルトの名無しさん
2010/06/06(日) 00:23:14気になる。ソースソース。
0061デフォルトの名無しさん
2010/06/06(日) 08:48:100062デフォルトの名無しさん
2010/06/06(日) 09:25:29using namespace std;
なんてしてないよな?
0063デフォルトの名無しさん
2010/06/06(日) 09:57:460064デフォルトの名無しさん
2010/06/06(日) 10:05:570065デフォルトの名無しさん
2010/06/06(日) 10:16:49ヘッダのnamespace内でusingすることはあるけどなぁ
boost::tr1の真似して
0066デフォルトの名無しさん
2010/06/06(日) 10:26:16名前を取り込みたい時であって
名前空間を省略したい時ではないぞ
0067デフォルトの名無しさん
2010/06/06(日) 12:45:210068デフォルトの名無しさん
2010/06/06(日) 12:52:200069デフォルトの名無しさん
2010/06/06(日) 13:28:060070デフォルトの名無しさん
2010/06/06(日) 15:16:35{
・・・
}
この書き方ってなんかイイコトあるんですか?
0071デフォルトの名無しさん
2010/06/06(日) 15:23:13が出来る、とか
0072デフォルトの名無しさん
2010/06/06(日) 15:37:14auto add(const T1& a, const T2& b) -> decltype(a + b) { return a + b; }
ができるからと言われるけど
template <typename T1, typename T2>
auto add(const T1& a, const T2& b) { return a + b; }
を許してもらえるなら必要ないよね
そもそも a + b を2度書かないといけないのが気に食わない
0073デフォルトの名無しさん
2010/06/06(日) 15:38:39auto add(const T1& a, const T2& b) -> decltype(a + b);
0074デフォルトの名無しさん
2010/06/06(日) 15:50:35{
piyo y;
return x + y;
}
この場合はこう書くの?
けっこうメンドクセーな
0075デフォルトの名無しさん
2010/06/06(日) 16:23:37auto add(const T1&, const T2&) -> decltype(std::declval<T1>() + std::declval<T2>());
0076デフォルトの名無しさん
2010/06/06(日) 17:24:05{
typedef int type ;
type f() ;
} ;
というクラスがあった場合、このHoge::fの定義を書くのに、
従来の関数宣言の場合、
Hoge::type Hoge::f() { return 0 ; }
新しい関数宣言の場合、
auto Hoge::f() -> type { return 0 ; }
戻り値にクラス名の修飾がいらない。
0077デフォルトの名無しさん
2010/06/06(日) 17:26:41Hoge:: くらいなら auto -> 書くのと大差ないけど
もっと長いと使えるかも
0078デフォルトの名無しさん
2010/06/06(日) 17:34:210079デフォルトの名無しさん
2010/06/06(日) 17:43:35気持ちを最優先にしてもコンパイルに関係ないし。
0080デフォルトの名無しさん
2010/06/06(日) 18:11:300081デフォルトの名無しさん
2010/06/06(日) 18:12:35型が右に来る方が直感的
0082デフォルトの名無しさん
2010/06/06(日) 18:31:240083デフォルトの名無しさん
2010/06/06(日) 18:37:22class LongLongHogeHugaItteyoshiClass{
public:
typedef VeryVeryLongLongHawawaTypeName T;
T f();
};
auto LongLongHogeHugaItteyoshiClass::f() -> T
{
...
}
0084デフォルトの名無しさん
2010/06/06(日) 18:39:18#include "LongLongHogeHugaItteyoshiClass.h"
typedef LongLongHogeHugaItteyoshiClass L;
L::T L::f() {
}
008583
2010/06/06(日) 18:40:000086デフォルトの名無しさん
2010/06/06(日) 19:32:46class 中の private な typedef にも使用可能だったはず…
0087デフォルトの名無しさん
2010/06/06(日) 19:49:530088デフォルトの名無しさん
2010/06/06(日) 20:28:57ていうか入力補完でいいじゃないか
0089デフォルトの名無しさん
2010/06/06(日) 20:43:050090デフォルトの名無しさん
2010/06/06(日) 20:47:060091デフォルトの名無しさん
2010/06/06(日) 20:47:48読み辛い
0092デフォルトの名無しさん
2010/06/06(日) 20:48:520093デフォルトの名無しさん
2010/06/06(日) 20:50:39C#のひとか?
0094デフォルトの名無しさん
2010/06/06(日) 20:53:310095デフォルトの名無しさん
2010/06/06(日) 21:03:290096デフォルトの名無しさん
2010/06/06(日) 21:05:570097デフォルトの名無しさん
2010/06/06(日) 21:07:400098デフォルトの名無しさん
2010/06/06(日) 21:08:390099デフォルトの名無しさん
2010/06/06(日) 21:35:100100デフォルトの名無しさん
2010/06/06(日) 21:36:570101デフォルトの名無しさん
2010/06/06(日) 21:43:38外から使えないし
0102デフォルトの名無しさん
2010/06/06(日) 21:55:01typenameも必要だ。
0103デフォルトの名無しさん
2010/06/06(日) 22:37:59最近の言語はみんな右に書くようになってるんだぜ?
0104デフォルトの名無しさん
2010/06/06(日) 22:39:050105デフォルトの名無しさん
2010/06/06(日) 22:40:470106デフォルトの名無しさん
2010/06/06(日) 23:06:40C#はどうだっつんだ
てか、右でも左でもどっちでも変わらん
どちらが直感的とかない
0107デフォルトの名無しさん
2010/06/06(日) 23:10:22従来の文法を拡張したら仕方なくそうなったって奴が多いな
0108デフォルトの名無しさん
2010/06/06(日) 23:12:130109デフォルトの名無しさん
2010/06/07(月) 06:56:32英語的には右
0110デフォルトの名無しさん
2010/06/07(月) 07:27:090111デフォルトの名無しさん
2010/06/07(月) 07:32:54int bb;
int ccc;
int dddd;
a : int
bb : int
ccc : int
dddd : int
下は揃わないな
0112デフォルトの名無しさん
2010/06/07(月) 10:03:52存在意義がいまいち不明なんですが・・・
0113デフォルトの名無しさん
2010/06/07(月) 10:40:53http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1344.pdf
0114デフォルトの名無しさん
2010/06/08(火) 09:08:120115デフォルトの名無しさん
2010/06/08(火) 22:34:160116デフォルトの名無しさん
2010/06/08(火) 23:42:000117デフォルトの名無しさん
2010/06/09(水) 10:14:37数学的には右だな
0118デフォルトの名無しさん
2010/06/09(水) 12:32:560119デフォルトの名無しさん
2010/06/09(水) 13:19:190120デフォルトの名無しさん
2010/06/09(水) 13:33:060121デフォルトの名無しさん
2010/06/09(水) 16:00:150122デフォルトの名無しさん
2010/06/09(水) 23:11:250123デフォルトの名無しさん
2010/06/09(水) 23:19:100124デフォルトの名無しさん
2010/06/09(水) 23:19:54VC++2010ですができませんよ?
0125124
2010/06/09(水) 23:20:460126デフォルトの名無しさん
2010/06/09(水) 23:35:020127デフォルトの名無しさん
2010/06/09(水) 23:36:220128デフォルトの名無しさん
2010/06/09(水) 23:44:54無理じゃね?
0129デフォルトの名無しさん
2010/06/10(木) 16:02:020130デフォルトの名無しさん
2010/06/10(木) 22:43:560131デフォルトの名無しさん
2010/06/11(金) 01:30:34VC++ 2010がまだ追い付いていないだけ。
0132デフォルトの名無しさん
2010/06/11(金) 02:50:48auto *x = new vector<int>;
f(move(*x));
delete x; // ← このdeleteってなんか変なこと起こさないですか?
0133デフォルトの名無しさん
2010/06/11(金) 02:55:300134デフォルトの名無しさん
2010/06/11(金) 03:26:59そんなまさか
0135デフォルトの名無しさん
2010/06/11(金) 04:03:25>>133みたいな勘違いする奴が。
0136デフォルトの名無しさん
2010/06/12(土) 07:33:150137デフォルトの名無しさん
2010/06/12(土) 07:41:12ができる以上、デストラクタは呼べるはず
だからdeleteしても問題ないはず
0138デフォルトの名無しさん
2010/06/12(土) 07:58:10自前でstatic_castさせときゃいいんだよ。
0139デフォルトの名無しさん
2010/06/12(土) 08:08:29「はず」プゲラ
0140デフォルトの名無しさん
2010/06/12(土) 08:16:22Hoge func()
{
Hoge temp;
temp.f1();
temp.f2();
return std::move(temp);
}
0141デフォルトの名無しさん
2010/06/12(土) 08:18:59その場合、
もしHogeがムーブコンストラクターを実装していなければ、
コピーコンストラクターが呼ばれる。
というか、最適化によって、コピーコンストラクターの呼び出しが省略される可能性もあるが。
0142デフォルトの名無しさん
2010/06/12(土) 08:24:260143デフォルトの名無しさん
2010/06/12(土) 08:26:54RVO可能->コピコンそのものが不用
RVO不可->コピコンまたはムーブ適用
ムーブコンストラクタがあってもRVO可能であればRVOが適用されるでいいのかな。
とりあえずstd::moveつけて置けば問題ないということでOK?
0144デフォルトの名無しさん
2010/06/12(土) 08:32:04ごめん、読み間違えた。「ムーブより・・・優先」とみて条件反射でコピーコンストラクターだと思ってしまった。
0145デフォルトの名無しさん
2010/06/12(土) 08:36:07よく考えたら、std::move通した時点でRVO可能なオブジェクトとコンパイラが認識できなくなる可能性があるね。
実験しないと分からないや
0146デフォルトの名無しさん
2010/06/12(土) 08:39:15なぜ? rvalue referenceにキャストしているだけじゃないか。
ポインターならともかく。
0147デフォルトの名無しさん
2010/06/12(土) 08:40:11未だにまともなC++コンパイラは存在しないんだぞ。
何を実験するというんだ。
0148デフォルトの名無しさん
2010/06/12(土) 08:43:44RVO_OR_MOVE()マクロ作って後からまとめて切り替えられるようにしておこうか。
0149デフォルトの名無しさん
2010/06/12(土) 08:45:58キャストでコンパイラが自動変数って情報を落として最適化できなくなるんじゃないかなっと思った。
0150デフォルトの名無しさん
2010/06/12(土) 08:47:350151デフォルトの名無しさん
2010/06/12(土) 09:19:150152デフォルトの名無しさん
2010/06/12(土) 09:24:16RVOは最適化だから確実な予測はできない。
0153デフォルトの名無しさん
2010/06/12(土) 09:33:36RVOはコスト0
0154デフォルトの名無しさん
2010/06/12(土) 17:52:49return std::move(temp);
じゃなくて
return temp;
とだけ書いていれば良いのでは?
0155デフォルトの名無しさん
2010/06/12(土) 18:27:16たとえばこれならほぼ確実にRVOがかかる。
return hoge(100);
だけど、こんな複雑な場合だとRVOがかからない場合がある。
hoge temp;
temp.func(100);//なんか操作する。
return temp;
RVOかからないなら次善策でムーブを使いたいなと。
0156デフォルトの名無しさん
2010/06/12(土) 19:11:55return文で(コピーではなく)ムーブすることも決まっていることも決まっているから、
return temp;とだけ書いておけば、NRVOが適用されるならそれで、
適用されないならムーブで処理されることになるはず。
0157デフォルトの名無しさん
2010/06/12(土) 19:16:08いや,なのでそうとだけ書いておきさえすれば
(1)コンパイラが RVO を適用できるならする
(2)hoge が move constructor を持っているならば return で move を使う
(3)コピー
というのを上から順に適用していって可能なものを採用すると思います.
(2) は, return temp; という文においては temp が自動変数なので,
まず temp を自動的に右辺値として取り扱おうとするはずだからです.
0158124
2010/06/12(土) 19:18:10moveにならなくて不愉快
0159デフォルトの名無しさん
2010/06/12(土) 19:36:18それはconstなオブジェクトからムーブできない話であって、また別の話。
ムーブは元オブジェクトを破壊してよいことを前提としているので、
constなオブジェクトはすなわち破壊できないので、そこからムーブできないということ。
可能な限りconst付ける教とムーブセマンティクスは本質的に相性が良くない。
0162デフォルトの名無しさん
2010/06/12(土) 19:45:120163デフォルトの名無しさん
2010/06/12(土) 19:46:59丁寧な回答ありがとうです。
returnはmoveを使うで理解しました。
c++0xは思ったより気が利いてるなと感心したり
0164デフォルトの名無しさん
2010/06/12(土) 20:58:400165デフォルトの名無しさん
2010/06/12(土) 21:41:28あほか
まだVC2010そのものが店頭で売ってない
ダウンロード販売のみ
SP1はいくらなんでもその後だろう
あるとしたら店頭に並んでるものに既にSP1が適用してあるとか
そういう場合くらいしか
0166デフォルトの名無しさん
2010/06/12(土) 22:58:100167デフォルトの名無しさん
2010/06/12(土) 23:22:51IDEからしてクソすぎるし。
0168デフォルトの名無しさん
2010/06/12(土) 23:29:15さっさとてめえの化石PCを窓から投げ捨てろ
0169デフォルトの名無しさん
2010/06/12(土) 23:40:210170デフォルトの名無しさん
2010/06/13(日) 00:19:020171デフォルトの名無しさん
2010/06/13(日) 00:24:470172デフォルトの名無しさん
2010/06/13(日) 00:26:23独占ですから
0173デフォルトの名無しさん
2010/06/13(日) 05:08:33devenv /useenv
0174デフォルトの名無しさん
2010/06/16(水) 14:31:330175デフォルトの名無しさん
2010/06/16(水) 14:53:130176デフォルトの名無しさん
2010/06/16(水) 15:14:40できたかどうかわかるよ
0177デフォルトの名無しさん
2010/06/16(水) 17:06:450178デフォルトの名無しさん
2010/06/16(水) 19:19:300179デフォルトの名無しさん
2010/06/16(水) 20:49:23規格上許しているんだから、コピコン省かれて困る設計のほうがまずいんではないか?
0180デフォルトの名無しさん
2010/06/16(水) 20:53:130181デフォルトの名無しさん
2010/06/16(水) 21:29:39#include <iostream>
struct Hoge
{
static volatile int count_;
Hoge()
{
}
Hoge(const Hoge & hoge)
{
++count_;
}
};
volatile int Hoge::count_ = 0;
Hoge test()
{
return Hoge();
}
int main(void)
{
Hoge h(test()), g(test());
std::cout << Hoge::count_ << std::endl;
return 0;
}
ってやってみたけどcount_はゼロだったぜ
volatile無視かよ
0182デフォルトの名無しさん
2010/06/16(水) 21:35:54RVOでコピコンがそのもの省略されてるんだから、countのvolatileは無関係だろ。
0183デフォルトの名無しさん
2010/06/16(水) 21:39:19コピコンが影響するのはアクセス制限くらいやで
0184デフォルトの名無しさん
2010/06/16(水) 21:46:520185デフォルトの名無しさん
2010/06/16(水) 21:56:38こんなの通してreturnに渡したらかからなくなったことがあったような気がする
template<class T>
inline T& stop(T& a)
{
returan a;
}
RVOが効いて困るコードを書く方が問題があるぞ。バグの温床じゃないか?直したほうがいいよ。
0186デフォルトの名無しさん
2010/06/16(水) 22:00:230187デフォルトの名無しさん
2010/06/16(水) 22:04:18理解したくもないが
0188デフォルトの名無しさん
2010/06/17(木) 13:02:02RVOうぜー。
0189デフォルトの名無しさん
2010/06/17(木) 15:59:55だからね。
(RVO OR 無し) あるいは (move())
だから非常に困るね。
0190デフォルトの名無しさん
2010/06/17(木) 18:31:44もっと整理して書けよw
プログラムもそうなのか?
0191デフォルトの名無しさん
2010/06/17(木) 20:03:02コピーしているならRVOじゃないよね。コピーそのもの存在を無くすのがRVOなのに。
どんなコピーコンストラクタかいてるの?
0192デフォルトの名無しさん
2010/06/17(木) 20:19:52お前のコードが糞
0193デフォルトの名無しさん
2010/06/17(木) 20:25:34どこが困るのかな?
0194デフォルトの名無しさん
2010/06/18(金) 09:27:08再帰はオーバーヘッドがありそうで嫌です
0195デフォルトの名無しさん
2010/06/18(金) 12:04:450196デフォルトの名無しさん
2010/06/18(金) 12:07:27ちょっと意味わからないから
コードを2chのこのスレッドに投稿してくれる??
「this->」みたいなもんか
0198デフォルトの名無しさん
2010/06/18(金) 15:45:10非constで左辺・右辺両方を受け取れるにはどうすればいいの?
0199デフォルトの名無しさん
2010/06/18(金) 16:15:580200デフォルトの名無しさん
2010/06/18(金) 19:20:020201デフォルトの名無しさん
2010/06/18(金) 19:30:210202デフォルトの名無しさん
2010/06/18(金) 19:57:110203デフォルトの名無しさん
2010/06/18(金) 20:03:290204デフォルトの名無しさん
2010/06/18(金) 20:51:390205デフォルトの名無しさん
2010/06/18(金) 20:53:31コンテナから本体を書き換えることのできる部分コンテナを返す関数を
別の関数に参照渡しする場合だな。
具体的にはOpenCVのcv::Matの部分配列(ROI)なんだが。
VC++の非標準の拡張によって右辺値が非constの左辺値参照に置き換えられてたみたいだ。
コンパイルレベルをあげたら警告が出た。
0206デフォルトの名無しさん
2010/06/18(金) 20:59:00右辺値を非constで左辺値のように受けるのは危険だから受けられないようになっている。そのための&&だ。
まずそれが必要か考え直したほうがいい。
0207デフォルトの名無しさん
2010/06/19(土) 02:14:34#include <iostream>
auto main() -> int
{
[]{ std::cout << "hello, world\n"; }();
}
以下の部分は何を意味してるのでしょうか?
main() -> int
0208デフォルトの名無しさん
2010/06/19(土) 02:19:480209デフォルトの名無しさん
2010/06/19(土) 02:21:040210デフォルトの名無しさん
2010/06/19(土) 02:24:040211デフォルトの名無しさん
2010/06/19(土) 02:25:060212207
2010/06/19(土) 02:26:000213デフォルトの名無しさん
2010/06/19(土) 08:36:410214デフォルトの名無しさん
2010/06/19(土) 08:43:30auto func(int x)->decltype(hoge(x)){return hoge(x);}
これをこんな風にかけると二回同じ式を書かなくてすむんだけど
auto func(int x)->hoge(x);
0215デフォルトの名無しさん
2010/06/19(土) 08:48:47普通にこれでええやん
auto func(int x) { return hoge(x); }
ラムダではできるのに普通の関数ではできない仕様なのは
ヘッダに書く関数や単一ファイル内で使う関数でないと意味がないからか?
と思ったけど、これやりたいのって大体関数テンプレートだから
できてもいいように思える
0216デフォルトの名無しさん
2010/06/19(土) 08:51:030217デフォルトの名無しさん
2010/06/19(土) 08:56:11そんな記述もできるの?
{}のなかを評価しないと戻りの型が決まらないんでできないと思ってた。コンパイラは大変だなあ
もしこの関数がメンバー関数の場合{}の中は前方参照不可とか制約無いのかな?
0218デフォルトの名無しさん
2010/06/19(土) 08:56:12とっくにrejectされてんだから
0219デフォルトの名無しさん
2010/06/19(土) 08:56:43できない
0220デフォルトの名無しさん
2010/06/19(土) 08:58:14なら行ける
けどテンプレートにできんのよね
0221デフォルトの名無しさん
2010/06/19(土) 09:04:05VC++2010で使えるけど、これは先走ったわけか
auto hoge() -> int { return 0; } // OK
int main() { return hoge(); }
0222デフォルトの名無しさん
2010/06/19(土) 09:16:200223デフォルトの名無しさん
2010/06/19(土) 09:23:290224デフォルトの名無しさん
2010/06/19(土) 09:24:51unified function syntaxってのはこれ
[]main()->int{ return 0; }
0225デフォルトの名無しさん
2010/06/19(土) 09:31:49なるほど
0226デフォルトの名無しさん
2010/06/19(土) 09:35:18ラムダでは戻り値型の推測はできるので
普通の関数でもできないわけじゃないはずだ
普通の関数は多値returnができるけど
ラムダではできないという違いも
普通の関数での戻り値推測がない点に関係あるのだろうか?
0227デフォルトの名無しさん
2010/06/19(土) 09:37:35普通の関数やメンバ関数はヘッダとソースが分かれてるかもしれない
0228デフォルトの名無しさん
2010/06/19(土) 09:41:060229デフォルトの名無しさん
2010/06/19(土) 10:08:13> 普通の関数は多値returnができるけど
C++ って多値返せないだろ, どういう意味だ?
0230デフォルトの名無しさん
2010/06/19(土) 10:16:220232デフォルトの名無しさん
2010/06/19(土) 10:33:26std::initializer_list を引数に取るコンストラクタを持つクラスが戻り値の型になってる場合、
return { 0, 1 }; みたいにできる
0233デフォルトの名無しさん
2010/06/19(土) 18:22:52みたいな引数の型を推論してくれるようなラムダってないの?ないの?の?
0234デフォルトの名無しさん
2010/06/19(土) 18:30:450235デフォルトの名無しさん
2010/06/19(土) 18:36:530236デフォルトの名無しさん
2010/06/19(土) 19:04:51イラネ、ライブラリで対応できる。
そういう言語サポートが必要なのは拡張能力の乏しい言語だけ
0237デフォルトの名無しさん
2010/06/19(土) 19:07:570238デフォルトの名無しさん
2010/06/19(土) 19:11:30第二水準標準ライブラリとか作って採用して欲しい。
0239デフォルトの名無しさん
2010/06/19(土) 19:14:26initializer_listもライブラリでいいんだな?
0240188
2010/06/19(土) 19:25:21いや処理系の問題だが、ICCなんかループが深くなると添字の計算をループの外に出さなくなって途端に遅くなる問題とかあるぞ。
m x nの二次元配列aで直線的にアクセスする場合、
for ( int j = 0; j < n; ++j ) {
for ( int i = 0; i < m; ++i ) {
// a[i+j*m] を読み出してなんか処理
}}
で通常j*mはfor(i)の外に移動される。
でもこのループが同じ関数内でも4重5重とネストが深い時に外に出されなくなった。
これが三次元配列、四次元配列となるにつれ、
a[i+j*m+k*m*n+l*m*n*o ...]と式が複雑になっていって、コンパイラを混乱させる。
なので多次元配列が組み込みとして存在すれば、最適化の推論は簡単になる。
0241デフォルトの名無しさん
2010/06/19(土) 19:28:25多次元配列に夢の持ちすぎだろう。
0242デフォルトの名無しさん
2010/06/19(土) 19:36:50そういうのって、部分配列で次元数を減少させてループを書いたりするんじゃね?
いくら組み込みでも多次元の添え字をランダムアクセスで渡せば最適化できないだろう。結局同じテクニックが必要だと思うんだ。
0243デフォルトの名無しさん
2010/06/19(土) 19:51:32処理系の所為なら同じ問題が起きるだけじゃね?
0244デフォルトの名無しさん
2010/06/19(土) 20:50:00C配列、FORTRAN配列、row-first、collumn-first
使用目的に応じて実装できるライブラリが適してると思うんだよ。
行列にしても、帯行列、三角、スパース行列、など行列の特性に応じた格納方法があるし。
組み込み多次元配列を用意したところで適用できなければメリットは小さいと思うよ。
0245188
2010/06/19(土) 21:13:45その理論だとFORTRANに多次元配列がある説明になっていないぞ。
確かに疎行列のような特殊なものはライブラリで補うしかない。
row-first、column-firstも行列積の概念から来ているだけ。
C言語的に必要なのはa(i, j)があった時にメモリが隣接しているのはどっちの添字かという事だけ。縦も横も無い。
あとCの静的多次元配列は「ポインタの配列」または「ポインタのポインタ」と矛盾しないようにあんな順序になっているだけ。
>>235は単に基本となる配列を動的多次元にしてくれって言っているだけでしょ。
そしてその意見には>>240的観点から賛同する。
0246デフォルトの名無しさん
2010/06/19(土) 21:32:220247デフォルトの名無しさん
2010/06/19(土) 23:56:42std::vectorからの0オーバーヘッドを保ちつつ作れそうか
0248デフォルトの名無しさん
2010/06/20(日) 01:39:130249デフォルトの名無しさん
2010/06/20(日) 01:54:510250デフォルトの名無しさん
2010/06/20(日) 06:25:210251デフォルトの名無しさん
2010/06/20(日) 08:30:170252デフォルトの名無しさん
2010/06/20(日) 08:39:11組み込みの多次元配列が有ってうれしいことはあっても困ることはない
0253デフォルトの名無しさん
2010/06/20(日) 09:05:120254デフォルトの名無しさん
2010/06/20(日) 09:14:11言語の歴史から言えば多分RVOよかよっぽど基本的な話。
0255デフォルトの名無しさん
2010/06/20(日) 09:14:41実現方法がたくさんあると、ライブラリ間でのデータの受け渡しに支障が出る。
0256デフォルトの名無しさん
2010/06/20(日) 09:27:42FORTRANはデータだけでもコンパイラに多次元配列である事を伝えることが出来る。
Cっぽく書くと
void func(int n, int m, int array[m][n]) {}
ってな感じ。
0257デフォルトの名無しさん
2010/06/20(日) 09:32:530258デフォルトの名無しさん
2010/06/20(日) 09:39:450259デフォルトの名無しさん
2010/06/20(日) 09:40:08組み込みじゃないなと嫌っていう人はFORTRANを遣えば良いってだけの話。
0260デフォルトの名無しさん
2010/06/20(日) 09:41:38そういう本質が分からん奴に限ってWin32APIで絵を表示しようとしたときに
SetPixelを使って、「遅い」とか言い出すんだよなあ。
0261デフォルトの名無しさん
2010/06/20(日) 09:42:22コンセプトは必要。マジ欲しい。
0262デフォルトの名無しさん
2010/06/20(日) 09:44:00そうそう
規格で統一すれば異なるライブラリ間で多次元配列を簡単にやり取りできるのにね
0263デフォルトの名無しさん
2010/06/20(日) 09:50:59一旦配列に確保されたかのように扱われるから OK のはず。end() も begin() + size() になってる。
0264デフォルトの名無しさん
2010/06/21(月) 12:34:28registerが肥やしに変わった以上、マジそれがないと実現不可能とかじゃないと追加は難しいんじゃないかな
上の例だと「ネストが深くても最適化してくんない?」ってIntelにリクエストすればいいだけだし
0265デフォルトの名無しさん
2010/06/22(火) 02:03:03そんなこと言うならRVOとかmoveとか口にするなよ。
initializer_listだってなんだって、多くのものは利便性の向上をメインとして
更に最適化の機会向上も兼ね備えているんだよ。
0266デフォルトの名無しさん
2010/06/22(火) 07:00:080267デフォルトの名無しさん
2010/06/22(火) 07:13:060268デフォルトの名無しさん
2010/06/22(火) 07:22:11もっと一般化できそうだが
0269デフォルトの名無しさん
2010/06/22(火) 08:18:46あまり続けると、他の話題を出したい人が話に割り込めなくなるのが怖いだけだ。
0270デフォルトの名無しさん
2010/06/22(火) 08:20:200271デフォルトの名無しさん
2010/06/22(火) 11:47:020272デフォルトの名無しさん
2010/06/22(火) 11:51:110273デフォルトの名無しさん
2010/06/22(火) 12:40:08いい事だ
0274デフォルトの名無しさん
2010/06/22(火) 13:21:510275デフォルトの名無しさん
2010/06/22(火) 14:59:48ConceptGCCの中の人がC++サポートをやってるし。
0276デフォルトの名無しさん
2010/06/22(火) 21:01:57インクルードガードだと、インクルードが循環参照するとコンパイルされなくてエラーになるのが便利。
#pragma oneceだとヘッダの参照関係が循環してもコンパイルが通ってしまって不便、危険。
0277デフォルトの名無しさん
2010/06/22(火) 21:23:050278デフォルトの名無しさん
2010/06/22(火) 21:39:280279デフォルトの名無しさん
2010/06/22(火) 21:39:43そしてそれが致命傷
0280デフォルトの名無しさん
2010/06/22(火) 21:41:360281デフォルトの名無しさん
2010/06/22(火) 22:18:18インクルードされないから循環参照をエラーとして検出できる。
0282デフォルトの名無しさん
2010/06/22(火) 22:28:47もちろんちゃんとコンパイルして期待した動作をすることを確かめてからな
0283デフォルトの名無しさん
2010/06/22(火) 22:36:01#ifndef a_h
#define a_h
#include "b.h"
struct A {};
#endif a_h
// b.h
#ifndef b_h
#define b_h
#include "a.h" // 循環参照
struct B {};
#endif b_h
// a.cpp
#include <ostream>
#include "a.h"
int main() {
std::cout << sizeof(A) << ' ' << sizeof(B) << std::endl;
}
問題なくコンパイルできる
0284デフォルトの名無しさん
2010/06/22(火) 22:37:43どんなファンタジーなんだ
0285デフォルトの名無しさん
2010/06/23(水) 03:22:22template<typename U, typename... Args> pair(U&&, Args&&...)
で構築するとして
pair<int, int> p(1);
の second は zero-initialized と決まってるんでしょうか
0286デフォルトの名無しさん
2010/06/23(水) 04:22:40どんなファンタジーなんだ
0287デフォルトの名無しさん
2010/06/23(水) 10:57:13ファイルに埋め込まれるから自己埋め込みになる。
0288デフォルトの名無しさん
2010/06/23(水) 11:11:05そろそろサンプルぷりーず
0289デフォルトの名無しさん
2010/06/23(水) 11:22:580290デフォルトの名無しさん
2010/06/23(水) 12:46:240291デフォルトの名無しさん
2010/06/23(水) 14:28:57そのコンストラクタは N3092 には無いです.
0292デフォルトの名無しさん
2010/06/23(水) 16:29:090293デフォルトの名無しさん
2010/06/23(水) 16:32:27上を目指すどころかコンパイラの仕組みも理解してない人多くね?
0294デフォルトの名無しさん
2010/06/23(水) 16:49:05コンパイラの仕組みとか以前というか
自分で勝手に意味を決めてるやつが多いのかな?
0295デフォルトの名無しさん
2010/06/23(水) 16:54:570296デフォルトの名無しさん
2010/06/23(水) 18:42:570297デフォルトの名無しさん
2010/06/23(水) 19:13:150298デフォルトの名無しさん
2010/06/23(水) 19:21:41パスが全く違っても同じ実体を指している事があるけど、
それも検出せなあかんのん? と
0299デフォルトの名無しさん
2010/06/23(水) 19:24:200300デフォルトの名無しさん
2010/06/23(水) 19:25:10たとえ実態が別々でも
0301デフォルトの名無しさん
2010/06/23(水) 19:47:340302デフォルトの名無しさん
2010/06/23(水) 19:50:27根性ねえなぁ
0303デフォルトの名無しさん
2010/06/23(水) 19:53:110304デフォルトの名無しさん
2010/06/23(水) 19:57:11ソデスカ… orz
では、pair に限らず (U&&, Args&&... args) の args が省略された場合
fundamental type を forward<Args>(args)... で構築した場合
zero-initialized と期待していいのでしょうか
0305デフォルトの名無しさん
2010/06/23(水) 20:11:31ディレクトリ操作すら規格にない言語だから仕方がない
かろうじてディレクトリに関するerrnoがあるくらいだ
0306デフォルトの名無しさん
2010/06/23(水) 21:34:560307デフォルトの名無しさん
2010/06/23(水) 21:40:30外部に公開できる宣言をまとめたファイルが自動的に作られて、
それをimportするような感じになってくれればなあと思う
0308デフォルトの名無しさん
2010/06/23(水) 21:44:58そこから必要な宣言集を構築してくれるような仕組みの方がいい。
わざわざ分ける必要はない。
いまどきヘッダーファイルなんて時代じゃねーだろ。
0309デフォルトの名無しさん
2010/06/23(水) 21:45:580310デフォルトの名無しさん
2010/06/23(水) 22:44:31C++でそれやると現実的なコンパイル速度にならない気がする
0311デフォルトの名無しさん
2010/06/23(水) 23:00:42まさにGoのやり方.
0312デフォルトの名無しさん
2010/06/24(木) 08:09:140313デフォルトの名無しさん
2010/06/24(木) 08:39:240314デフォルトの名無しさん
2010/06/24(木) 10:05:24お前のプログラムがリバースエンジニアリングの対象になるわけねーだろ
思い上がるな
0315デフォルトの名無しさん
2010/06/24(木) 10:38:37上を目指すどころかコンピューターの仕組みも理解してない人多くね?
0316デフォルトの名無しさん
2010/06/24(木) 13:26:450317デフォルトの名無しさん
2010/06/24(木) 14:57:25こんな感じで右辺の評価が自動で関数オブジェクトになりshort circuitが可能になると思っていたのに自分でlambdaにしないと駄目なのか
0318デフォルトの名無しさん
2010/06/24(木) 21:38:20typedefしたらコンパイル通らなくなるし、配列のように振る舞うって聞いたのに代入したらベクターみたいに動作するし、[]の中に{}突っ込んでもエラー出るしでわけわからん
0319デフォルトの名無しさん
2010/06/24(木) 21:41:03まだ対応してないぞ
定義はあるけど
0320デフォルトの名無しさん
2010/06/24(木) 22:05:140321デフォルトの名無しさん
2010/06/24(木) 22:09:17IDEは2008の改良でいいのにあちこち退化して残念
0322デフォルトの名無しさん
2010/06/24(木) 22:09:470323デフォルトの名無しさん
2010/06/24(木) 22:18:400324デフォルトの名無しさん
2010/06/24(木) 22:20:110325デフォルトの名無しさん
2010/06/24(木) 22:21:59typedefはワケ分からんが、operator []は、まだ実装してない。
だいたい、initializer_listは配列のように振舞わない、どこで聞いたんだそんな話。
0326デフォルトの名無しさん
2010/06/24(木) 22:25:55報告しておいたら?
0327デフォルトの名無しさん
2010/06/24(木) 22:28:110328デフォルトの名無しさん
2010/06/24(木) 22:30:180329デフォルトの名無しさん
2010/06/24(木) 22:34:33ユーザー定義のクラスでも使えるようにしようというものだから、
その辺が伝聞が変化したのかも。
初期化リスト(initializer list)は、あたかも配列を初期化するように振舞う
↓
std::initializer_listは、あたかも配列のように振舞う
0330デフォルトの名無しさん
2010/06/24(木) 22:43:250331デフォルトの名無しさん
2010/06/24(木) 22:56:17[]() -> std::vector<int>
{
std::vector<int> v = {1,2,3} ;
return v ;
} ;
0332デフォルトの名無しさん
2010/06/24(木) 22:59:13みたいにしたいんだけどねえ
普通の関数ではできるのに
何で禁止したんだろ
実装が難しいの?
0333デフォルトの名無しさん
2010/06/24(木) 23:05:10[] { return std::vector<int>{1,2,3} ; } ;
0334デフォルトの名無しさん
2010/06/25(金) 07:17:43仕方がないのかねえ
0335デフォルトの名無しさん
2010/06/25(金) 08:19:460336デフォルトの名無しさん
2010/06/25(金) 09:09:480337デフォルトの名無しさん
2010/06/25(金) 09:15:050338デフォルトの名無しさん
2010/06/25(金) 09:30:030339デフォルトの名無しさん
2010/06/25(金) 10:11:300340デフォルトの名無しさん
2010/06/25(金) 11:53:170341デフォルトの名無しさん
2010/06/25(金) 19:24:210342デフォルトの名無しさん
2010/06/25(金) 22:16:390343デフォルトの名無しさん
2010/06/26(土) 00:38:01それだけじゃないよ
0344デフォルトの名無しさん
2010/06/27(日) 11:03:16(<vector>でのいわゆるswap技法に対応するもの)
0345デフォルトの名無しさん
2010/06/27(日) 11:06:280346デフォルトの名無しさん
2010/06/27(日) 11:15:36unordered_set<int> s;
for (i in 0...100) s.insert(i);
cout << s.bucket_count() << endl;
unordered_set<int>(s).swap(s);
cout << s.bucket_count() << endl;
> 199
> 199
0347デフォルトの名無しさん
2010/06/27(日) 11:18:30これだとsと同じコンテナとsの中身を交換という形になってしまうぞ。
vectorで同じことをしてもreserveされた領域は小さくなるだろうが、サイズは変わらない。
0348デフォルトの名無しさん
2010/06/27(日) 11:21:24バケツとアイテム数は同じにはならないだろ。
1000個挿入して900個消してからやってみ
0349デフォルトの名無しさん
2010/06/27(日) 11:23:290350デフォルトの名無しさん
2010/06/27(日) 11:24:030351デフォルトの名無しさん
2010/06/27(日) 11:24:55まあこのメンバ関数名もどうかと思うけど
0352デフォルトの名無しさん
2010/06/27(日) 11:27:010353350
2010/06/27(日) 11:29:120354デフォルトの名無しさん
2010/06/27(日) 11:30:05そもそもの目的は、
rehash(n)でバケツの数がn「以上」になってしまうのを
ちょうどnにしたいのです。
0355デフォルトの名無しさん
2010/06/27(日) 11:30:070356354
2010/06/27(日) 11:33:58になっていて、ハッシュ関数もユーザ定義しています。
0357デフォルトの名無しさん
2010/06/27(日) 11:34:16ならないし、気にするな
0359デフォルトの名無しさん
2010/06/27(日) 11:40:360360デフォルトの名無しさん
2010/06/27(日) 11:42:59そうだな、自分で作れば理由もわかるしな
0361354
2010/06/27(日) 11:43:51と言っておられるようですが、歴史的な経緯って誰か知りませんか?
0362354
2010/06/27(日) 11:44:51CSの人じゃないので、
お手軽hackに走っちゃうんですよね・・・。
精進します。
0363デフォルトの名無しさん
2010/06/27(日) 11:48:29どういう意図で言ってるのか解らんのでurl貼って。
0364デフォルトの名無しさん
2010/06/27(日) 11:51:41http://www.google.co.jp/search?q=%22%83o%83P%83c%82%D6%82%CC%83A%83N%83Z%83X%82%AA%92%F1%8B%9F%82%B3%82%EA%82%C4%82%E9%97%9D%97R%82%AA%95s%96%BE%22
そんなことを言っている奴はいない。
なんでそういう嘘をつくんだよ?
0365354
2010/06/27(日) 11:55:12あいまいな記憶ですけどここ以外にもあったような。
0366デフォルトの名無しさん
2010/06/27(日) 12:02:03ハッシュの性能評価とか
0367デフォルトの名無しさん
2010/06/27(日) 12:03:33>bucketの個数や容量、使用量を取得するメンバがあり、さらには、あるキーがどのbucketに属するかを取得するメンバもある
これだけ解ればハッシュをチューニングできるし、バケツにアクセスする必要ないだろう。
バケツへのアクセスを規定したら実装方法に制限を加えることになるから妥当じゃないのか。
0368デフォルトの名無しさん
2010/06/27(日) 19:14:31It's also useful to expose the bucket structure, for two reasons.
First, it lets users investigate how well their hash function performs: it lets them test how evenly elements are distributed within buckets,
and to look at the elements within a bucket to see if they have any common properties.
Second, if the iterators have an underlying segmented structure (as they do in existing singly linked list implementations),
algorithms that exploit that structure, with an explicit nested loop, can be more efficient than algorithms that view the elements as a flat range.
だそうだ
0369354
2010/06/27(日) 20:34:24わざわざ調べていただいて、ありがとうございました。
0370デフォルトの名無しさん
2010/06/27(日) 20:35:390371デフォルトの名無しさん
2010/06/27(日) 20:35:500372デフォルトの名無しさん
2010/06/29(火) 12:15:04こんなのを
my_tuple<int,int> tup={1,2};
自分でつくるとしたらどうするのがいいんですかね?
サイズの型チェックできなそうだし・・・。
0373デフォルトの名無しさん
2010/06/29(火) 18:31:03そうでなければboost::anyで包むしか
0374デフォルトの名無しさん
2010/06/29(火) 20:37:310375デフォルトの名無しさん
2010/06/29(火) 20:49:20ctor がexplicit でなければ uniform initialization が使えるはず
0376デフォルトの名無しさん
2010/06/29(火) 21:57:44違う型が混ざってれば問題ないんだけどすべて同じ型だとイニリスになって定義してないとコンパイルエラー
納得いかないわ
0377デフォルトの名無しさん
2010/06/29(火) 22:46:04もしあなたの処理系で std::tuple<int,int,int> t = {1, 2, 3}; でコンパイルエラーがでないなら、
あなたが何か勘違いしてるのだろう。
0378デフォルトの名無しさん
2010/06/29(火) 23:05:02struct C
{
template < typename... Types >
C(Types... args) { }
} ;
int main()
{
C c = {1,2,3} ;
}
当然これは通る。
通らなければお前のコンパイラがマヌケなだけだが。
0379デフォルトの名無しさん
2010/06/29(火) 23:10:44まじマヌケだなこの糞コンパイラ
0380デフォルトの名無しさん
2010/06/29(火) 23:16:02の
Comeau C/C++
では通らないの?
0381デフォルトの名無しさん
2010/06/30(水) 05:23:06未来からタイムマシーンでやってきたのか?
0382デフォルトの名無しさん
2010/06/30(水) 08:36:290383デフォルトの名無しさん
2010/06/30(水) 08:43:38ちなみに、4.6だと>>378は通る。
0384デフォルトの名無しさん
2010/06/30(水) 11:03:48ムーブコンストラクターを実装している場合に、その型のオブジェクトを返すとき戻り値をmove( );で返して
その他の場合はNRVOを使うために普通に返す。
なんて事ができる?
0385デフォルトの名無しさん
2010/06/30(水) 11:35:10それでRVOできなけりゃ、そりゃコンパイラがバカなだけだ。
0386デフォルトの名無しさん
2010/06/30(水) 11:59:080387デフォルトの名無しさん
2010/06/30(水) 12:07:31参照ではないprvalueで返せばいい。
class C {} ;
C f() { C c ; return std::move(c) ; }
int main()
{
C c = f() ;// まともなコンパイラならRVOできる
}
0388デフォルトの名無しさん
2010/06/30(水) 12:40:21日本語でおk
0389デフォルトの名無しさん
2010/06/30(水) 13:18:57理解できる言語が日本語だけだと厳しいかもしれないがw
0390デフォルトの名無しさん
2010/07/01(木) 12:03:39そもそも return move(....); がいらないだろ。 return ...; で同じことになるんじゃなかったっけ?
0391デフォルトの名無しさん
2010/07/01(木) 13:19:510392デフォルトの名無しさん
2010/07/01(木) 13:47:540393デフォルトの名無しさん
2010/07/01(木) 14:33:45Schemeの規格に、必ず末尾再帰の最適化をせよ、とあるのは、Schemeにとっては絶対に外せない根本的な概念だからなんだろうな。
ちなみに、return文の式は、コピーかムーブコンストラクターかのオーバーロード解決のためならば、
rvalueとして扱ってもいいことになっている。
0394デフォルトの名無しさん
2010/07/01(木) 21:01:28returnの式はソースだけじゃtaxon決まらないのかよ
相変わらず気持ち悪い仕様だな
0395デフォルトの名無しさん
2010/07/02(金) 01:54:47ってだけの話
0396デフォルトの名無しさん
2010/07/02(金) 02:09:17lvalueかrvalueかがunspecifiedな第4のvalue taxonが隠れてるって事じゃないの?
キモイよ
0397デフォルトの名無しさん
2010/07/02(金) 12:30:39無かったら一時オブジェクトにコピーするときコピーコンストラクターが
呼ばれてしまうとおもうがwwwww
0398デフォルトの名無しさん
2010/07/02(金) 13:52:39return文の式は、関数の戻り値の型に変換される。
これが大前提の挙動。
このとき、コピー、ムーブコンストラクターの呼び出しを省略してもよい
これが、RVO(Return Value Optimization)と呼ばれるもの。
このとき、コピーかムーブかのコンストラクターのオーバーロード解決のために、
式をrvalueとみなしてもよい。(つまり、ムーブコンストラクターを呼べる)
どんな式でもというわけにはいかんが、どうせreturn文が評価されるということは、
その関数のブロックスコープを抜けるということであって、ローカル変数の寿命は終わる。
もし、式がローカル変数のlvalueだとしたら、ムーブしたっていいだろ、どうせすぐ死ぬんだから。
0399デフォルトの名無しさん
2010/07/02(金) 13:58:240400デフォルトの名無しさん
2010/07/02(金) 14:00:29机上の空論乙
0401デフォルトの名無しさん
2010/07/02(金) 14:22:260402デフォルトの名無しさん
2010/07/02(金) 21:34:32「rvalue とみなしてもよい」ではなくて「まず rvalue とみなす」では?
0403デフォルトの名無しさん
2010/07/02(金) 22:02:21「ある基準が満たされたときに "when certain criteria are met",
RVO に相当する最適化をやっても良い "an implementation is allowed to...".
ごにょごにょ.
で, copy/move の省略は以下の状況で許される (...is permitted in the following circumstances).
(以下,その条件が列挙されている)」
と書いてあって, N3092 の 12.8/35 には
「copy の省略のための基準(★)が満たされていて "when the criteria for elision of a copy operation are met"
コピーされようとしているオブジェクトが lvalue なら,
コピーのためのコンストラクタを選択するオーバーロード解決は "overload resolution to select the constructor for the copy"
まずコピーされようとしているそのオブジェクトが rvalue であるかのように実行される
"is first performed as if the object were designated by an rvalue".」
★の基準は 12.8/34 に記述されている条件を指していると思われます.
で, 12.8/34 に列挙されている条件のうちの第1の bullet に書いてある内容から,
「return 文の式が,関数の戻り値型と (cv-qualification の違いを無視して) 同じ型の
non-volatile の自動オブジェクトの名前である場合」という条件の場合,
12.8/35 に書いてある挙動 (まず右辺値として扱ってみる) が発動すると思います.
(12.8/35 に書いてある挙動が発動することが許される,ではない)
0404デフォルトの名無しさん
2010/07/02(金) 22:12:0412.8/34 には「ある条件下でコピーの省略 (いわゆる RVO) を行うことが*許される*.この条件の1つに
return 文に指定された式が戻り値と同じ型の左辺値自動オブジェクトの場合がある.」と書いてあって,
12.8/35 には「12.8/34 に示された条件下では,コピー元をまず右辺値とみなせ. (みなしても良い,ではない)」
と書いてあるように読めますがどうでしょうか?
0405デフォルトの名無しさん
2010/07/03(土) 01:38:18コピーが省略出来る場合で、しかも省略しない場合は、まずムーブコンストラクターを優先的に使うんだな。
0406デフォルトの名無しさん
2010/07/03(土) 12:54:200407デフォルトの名無しさん
2010/07/04(日) 01:07:10もしかしてオランダ在住ですか?
0408デフォルトの名無しさん
2010/07/04(日) 13:33:18例えば下のauto_ptr-ライクなコードはムーブコンストラクタ可能ならコンパイルできて、
コピーコンストラクタが呼ばれたり、RVOが採用される場合はコンパイルエラーになるの?
ちなみにVS2010だとムーブコンストラクタが呼ばれる。
class Foo {
public:
Foo() : ptr_(new int(3)) {
std::clog << "construct Foo()\n";
}
~Foo() {
std::clog << "destruct Foo()\n";
delete ptr_;
}
Foo(Foo&& rhs) : ptr_(rhs.ptr_) {
std::clog << "construct Foo() by move\n";
rhs.ptr_ = 0;
}
private:
Foo(const Foo& rhs);
Foo& operator=(const Foo&);
private:
int* ptr_;
};
Foo createFoo() {
Foo f;
return f;
}
0409デフォルトの名無しさん
2010/07/04(日) 15:24:19ムーブが出来ない式ならコンパイルエラー
つーかunique_ptrに触れてみそ
0410デフォルトの名無しさん
2010/07/05(月) 13:48:20GCCで出来るか出来ないか
それだけが問題だろ。
0411デフォルトの名無しさん
2010/07/05(月) 15:52:25VCで出来るか出来ないか
それだけが問題さ。
0412デフォルトの名無しさん
2010/07/05(月) 16:38:48規格がどうなっているか。
それだけが問題なり。
0413デフォルトの名無しさん
2010/07/05(月) 17:31:20委員会のメンバーは実装者/組織を代表している。
いかに自分たちの実装(に基づく規格)を通すか。
いかに自分たち(の実装に)不利な規格を落とすか。
だから日本からの提案は無いし(たまに)あっても通らない。
わかったかな?
0414デフォルトの名無しさん
2010/07/05(月) 17:54:48わかるか?
0415デフォルトの名無しさん
2010/07/05(月) 20:12:500416デフォルトの名無しさん
2010/07/05(月) 21:22:060417デフォルトの名無しさん
2010/07/06(火) 12:57:30Initializer ListとRange-base forが無い所為で残念なソースコード
0418デフォルトの名無しさん
2010/07/06(火) 14:29:110419デフォルトの名無しさん
2010/07/06(火) 14:31:340420デフォルトの名無しさん
2010/07/06(火) 14:56:09そこでrange仮想クラスを継承ですよ、継承。
0421デフォルトの名無しさん
2010/07/07(水) 10:36:090422デフォルトの名無しさん
2010/07/07(水) 12:22:420423デフォルトの名無しさん
2010/07/07(水) 19:00:350424デフォルトの名無しさん
2010/07/07(水) 21:10:31もちろんconceptsも実装してだ。
0425デフォルトの名無しさん
2010/07/08(木) 00:51:06template <class T, class P> class Base;
を次のように継承したい場合に
template <class T, template <class> class Q>
class Derived: Base<T,Q<T>> {
typedef Base<T,Q<T>> base;
}
長ったるいBase<T,Q<T>>を2度書くことになってしまいます。
うまい解決策はないでしょうか?
0426デフォルトの名無しさん
2010/07/08(木) 01:03:590427デフォルトの名無しさん
2010/07/08(木) 01:07:420428デフォルトの名無しさん
2010/07/08(木) 01:15:33#define TLIST_2(T1,T2) Typelist<T1, TLIST_1(T2)>
とかしてますね・・・。
やっぱ無理か。
0429デフォルトの名無しさん
2010/07/08(木) 01:50:530430デフォルトの名無しさん
2010/07/08(木) 01:55:25class Derived2: Base<T, U> {
typedef Base<T, U> base;
};
とか
0431デフォルトの名無しさん
2010/07/08(木) 02:15:04その手を使うなら↓ここまでやったほうがよくね?
template <class T, template <class> class Q, class BaseT = Base<T,Q<T> > >
class Derived: BaseT {
typedef BaseT base;
};
0432デフォルトの名無しさん
2010/07/08(木) 06:35:33template <class T, template <class> class Q>
class Derived: Base<T,Q<T>> {
typedef Derived::Base base;
}
というかこれ、gccがおかしいんじゃねーかな。
Derivedにとって、Baseはinjected-class-nameだろ。
0433デフォルトの名無しさん
2010/07/08(木) 06:36:520434425
2010/07/08(木) 13:58:250435デフォルトの名無しさん
2010/07/08(木) 20:25:390436デフォルトの名無しさん
2010/07/08(木) 20:28:310437デフォルトの名無しさん
2010/07/08(木) 20:29:45西暦200x年、人類に(ry
0438デフォルトの名無しさん
2010/07/08(木) 20:58:21そう20x0だったんだよ!
0439デフォルトの名無しさん
2010/07/08(木) 21:20:270440デフォルトの名無しさん
2010/07/08(木) 21:54:100441デフォルトの名無しさん
2010/07/08(木) 23:08:140442デフォルトの名無しさん
2010/07/08(木) 23:19:49ハゲの論調だと 9 で終わりそうもないので 0...F みたいな感じだったが ...
0443デフォルトの名無しさん
2010/07/09(金) 02:30:57数字の範囲を超えそうなら36進数にでもして
桁を増やしていけばいいのに、なんで0xなんてわざわざつけたんだろう
0444デフォルトの名無しさん
2010/07/09(金) 18:19:31本当は2007年に完成する予定だったんだ
0445デフォルトの名無しさん
2010/07/09(金) 19:46:320446デフォルトの名無しさん
2010/07/09(金) 21:22:260447デフォルトの名無しさん
2010/07/09(金) 21:24:150448デフォルトの名無しさん
2010/07/09(金) 21:44:330449名無しさん@そうだ選挙に行こう
2010/07/10(土) 06:26:440450名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:56:520451名無しさん@そうだ選挙に行こう
2010/07/10(土) 17:00:450452名無しさん@そうだ選挙に行こう
2010/07/11(日) 08:38:270453名無しさん@そうだ選挙に行こう
2010/07/11(日) 09:47:28キレイなC++なんてC++じゃないんだ!
0454デフォルトの名無しさん
2010/07/13(火) 17:13:470455デフォルトの名無しさん
2010/07/13(火) 21:29:440456デフォルトの名無しさん
2010/07/14(水) 12:34:040457デフォルトの名無しさん
2010/07/14(水) 12:40:120458デフォルトの名無しさん
2010/07/14(水) 17:01:40C++0xに向けて調整中か?
0459デフォルトの名無しさん
2010/07/14(水) 20:14:47本屋がそんなこと把握してるのか・・・
0460デフォルトの名無しさん
2010/07/14(水) 20:38:030461デフォルトの名無しさん
2010/07/15(木) 07:29:300462デフォルトの名無しさん
2010/07/15(木) 09:47:510463デフォルトの名無しさん
2010/07/15(木) 21:05:280464デフォルトの名無しさん
2010/07/15(木) 23:26:27そのうちJAVAでOS作るのが当たり前の時代とかもきちゃったりするぞ。
0465デフォルトの名無しさん
2010/07/15(木) 23:30:370466デフォルトの名無しさん
2010/07/15(木) 23:40:29仮面ライダーにいたよ、そんな敵
0467デフォルトの名無しさん
2010/07/15(木) 23:52:10と、言われて10年たちましたね。
0468デフォルトの名無しさん
2010/07/16(金) 00:42:260469デフォルトの名無しさん
2010/07/16(金) 18:06:32ブートローダで真っ先にJVM呼ぶの?
ハードウェアアクセスを全部JVM様にお願いして仲介してもらうの?
カーネルのメモリまで全部GCに支配されてんの?
オエッ
0470デフォルトの名無しさん
2010/07/16(金) 18:16:200471デフォルトの名無しさん
2010/07/16(金) 18:59:50こういう商業版はしってたが
http://en.wikipedia.org/wiki/JavaOS
http://en.wikipedia.org/wiki/SavaJe
オープンソースもいくつかあるね
http://en.wikipedia.org/wiki/JNode
http://en.wikipedia.org/wiki/JX_(operating_system)
0472デフォルトの名無しさん
2010/07/16(金) 19:14:20もし仮にPCに電源投入すると
Javaインタープリターが起ち上るとするならば、
これもまたJavaOSと名乗ることを許されるのではないだろうか
0473デフォルトの名無しさん
2010/07/16(金) 19:28:29わかります
0474デフォルトの名無しさん
2010/07/16(金) 20:06:120475デフォルトの名無しさん
2010/07/16(金) 22:41:08ってVC++6.0のスプラッシュに書いてあった
0476デフォルトの名無しさん
2010/07/16(金) 23:08:41SingularityっていうC#(の拡張言語)で書かれた似たようなOSの場合は
WindowsでいうHALはC++で書かれていてそれ以外の部分がC#になってた
>>470
なんか10年前に話だけは聞いたことあるけどどうなったんだろうなアレ
0477デフォルトの名無しさん
2010/07/16(金) 23:35:400478デフォルトの名無しさん
2010/07/17(土) 01:41:41今のTexas InstrumentのARMプロセッサは多くが"Java Acceleration"
という機能を謳っているけど何なんだろう?
0479デフォルトの名無しさん
2010/07/17(土) 19:24:260480478
2010/07/17(土) 20:14:33で定義されてるんだ。
Java Technology Knowledge Article
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/kiRFU6S7H96L83.html
機能としてはほとんどのバイトコードを直接実行するDBX (Direct Bytecode eXecution) と
AOTやJITのコンパイル機能を補佐するRCT(Run-time Compilation Target)の2つになる。
ARMってすごいなあ。
0481デフォルトの名無しさん
2010/07/17(土) 20:22:570482デフォルトの名無しさん
2010/07/17(土) 20:45:05当時からアイディアはあったんだよ。
ちなみに、今とまったく同じautoは、すでに1982年に、C with Classesの一部として、禿によって実装されていた。
残念ながら、Cとの互換性の問題で、消さなければならなかったっけれど。
0483デフォルトの名無しさん
2010/07/17(土) 20:50:30消さなきゃ良かったのに。
0484デフォルトの名無しさん
2010/07/17(土) 21:06:150485デフォルトの名無しさん
2010/07/17(土) 21:14:35auto
って何に使うの?
0486デフォルトの名無しさん
2010/07/17(土) 21:38:31void foo(){
int x;
&x;
}
こんなxを勝手にレジスタに置いてポインタが取れないと癇癪を起こしてたのさ
昔々のコンパイラは
0487485
2010/07/17(土) 21:41:08タイプ量を増やす以外の役割は??
0488デフォルトの名無しさん
2010/07/17(土) 21:42:05あ、ごめん、
> 昔々のコンパイラは
ね。
ってことは、途中で規格が改訂されて省略可能になったわけか。
ありがとうございます。
0489デフォルトの名無しさん
2010/07/18(日) 11:33:320490デフォルトの名無しさん
2010/07/18(日) 11:36:55std::vector<int>& Get(){
return vec;//クラス内で宣言済み
}
上のようなメソッドが有って、
auto vec = hoge.Get();
ってやったら、ムーブかコピーだった。参照で受け取れるとおもったんだが。
で、結局
auto& vec = hoge.Get()
ってやったら意図通りになった。@VC10
0491デフォルトの名無しさん
2010/07/18(日) 12:02:20規格上の動作はVC10と違うの?
0492デフォルトの名無しさん
2010/07/18(日) 12:09:28たとえhoge.Get()が参照を返したとしても、式中では参照のついたstd::vector<int>&ではなくstd::vector<int>として評価される。
これは0xに関係なく今の時点でもそう。
どうしてもと言いたければboost::refを使って式中の評価を参照修飾にする必要がある。
0493デフォルトの名無しさん
2010/07/18(日) 12:14:120494デフォルトの名無しさん
2010/07/18(日) 12:24:12どこを困ってるかわからん
0495デフォルトの名無しさん
2010/07/18(日) 12:25:560496デフォルトの名無しさん
2010/07/18(日) 12:27:310497490
2010/07/18(日) 12:31:26>>491
いやー、俺の勘違いのようですよ。
戻り値の型を評価されるんだと思ってたので、&取られるのは気づきにくいなーと。
>>492
詳細ありがとう。理解が深まって助かるよ。
厳密にboostのようなものが必要だったわけじゃないからいいんだけど、
知らなかったら、コストかかるわ、バグの元になってるわで、自分的には不味かったんだ。
>>493
decltype先生はタイプ量増えるから難しいね。
0498デフォルトの名無しさん
2010/07/18(日) 12:36:30>>494
最近はムーブされるから多少マシになったけど、その前はRVOか全コピーだからマズーって感じ??
>>495-496
decltype先生は用途がむずかしいね。
0499デフォルトの名無しさん
2010/07/18(日) 12:56:32auto& みたいな書き方でOKだったじゃないか。
>>495 みたいなのは、&で返ってくるときは&で、
値で返ってくるときは値で受け取りたいときに使うってことだね。
0501デフォルトの名無しさん
2010/07/18(日) 15:45:49今までだと
auto hoge h;
これからは
auto h = hoge();
だから別に構文は被ってないじゃん
0502デフォルトの名無しさん
2010/07/18(日) 16:08:050503デフォルトの名無しさん
2010/07/18(日) 16:14:290504デフォルトの名無しさん
2010/07/18(日) 16:15:25Cの戻り値がそんなんだったような気が
0505デフォルトの名無しさん
2010/07/18(日) 16:17:11unsigned x = 0 ;// unsigned int
0506デフォルトの名無しさん
2010/07/18(日) 20:08:100507デフォルトの名無しさん
2010/07/18(日) 20:10:590508デフォルトの名無しさん
2010/07/18(日) 20:55:310509デフォルトの名無しさん
2010/07/18(日) 20:59:050510デフォルトの名無しさん
2010/07/18(日) 21:00:040511デフォルトの名無しさん
2010/07/18(日) 21:04:040512デフォルトの名無しさん
2010/07/18(日) 23:10:060513207
2010/07/19(月) 21:30:00gccで現在コンパイルがC++0xとして行われているか判別する方法はないでしょうか
事前定義マクロのようなものはないでしょうか?
0514デフォルトの名無しさん
2010/07/19(月) 21:31:190515デフォルトの名無しさん
2010/07/19(月) 21:43:07すみません.言葉が足りませんでした.
コード中で0xに対応していればstd::threadを
対応してなければboost::threadを使う
といった使い方をしたいのです.
0516デフォルトの名無しさん
2010/07/19(月) 21:47:26でいいと思う
0517デフォルトの名無しさん
2010/07/19(月) 21:52:10試してみます.
0518デフォルトの名無しさん
2010/07/19(月) 21:58:47In C++0x the macro __cplusplus will be set to a value that differs from (is greater than) the current 199711L.
とのことで
#if __cplusplus != 199711L
少し不安ですがでいけました.ありがとうございました.
0519デフォルトの名無しさん
2010/07/19(月) 22:02:50!=は不適切じゃないか?
0520デフォルトの名無しさん
2010/07/19(月) 22:24:08// 0x
#else
// boost
#endif
まだ少し不安ですがこうしてみました.
バージョンが新しいほど値が小さくなるのでしょうか
gcc version 4.4.3 で試しています.
0521デフォルトの名無しさん
2010/07/19(月) 22:26:01制定日を示してる
0522デフォルトの名無しさん
2010/07/19(月) 22:28:550523デフォルトの名無しさん
2010/07/19(月) 22:32:22なるほど
__cplusplusの値を見てみたのですが
msvcでは199711Lでした
gcc version 4.4.3では1でした
まだ制定されていないからでしょうか.
FAQにあるように,199711L以外としか決まってないのでしょうか
しょうが無いので1の場合は0xと見なして処理してみます.
0524デフォルトの名無しさん
2010/07/19(月) 22:33:230525デフォルトの名無しさん
2010/07/19(月) 22:36:39とりあえずgccはコンパイラのバージョンを見て決めることにしてみます
0526デフォルトの名無しさん
2010/07/19(月) 22:42:520527デフォルトの名無しさん
2010/07/19(月) 22:46:420528デフォルトの名無しさん
2010/07/21(水) 19:28:230529デフォルトの名無しさん
2010/07/21(水) 22:41:590530デフォルトの名無しさん
2010/07/22(木) 19:12:440531デフォルトの名無しさん
2010/07/22(木) 19:14:120532デフォルトの名無しさん
2010/07/23(金) 06:58:110533デフォルトの名無しさん
2010/08/02(月) 15:24:300534デフォルトの名無しさん
2010/08/02(月) 21:37:460535デフォルトの名無しさん
2010/08/03(火) 00:21:210536デフォルトの名無しさん
2010/08/03(火) 00:30:21C++0xでは例外指定が消えただの何だのと聞いたんですが、
try-catchが消えるってことですか?
0537デフォルトの名無しさん
2010/08/03(火) 00:33:40違う。
throw()のこと
0538デフォルトの名無しさん
2010/08/03(火) 01:54:090539デフォルトの名無しさん
2010/08/03(火) 03:24:46throwができなくなるor非推奨になるって認識で良いんでしょうか
0540デフォルトの名無しさん
2010/08/03(火) 03:34:37関数の定義の際に、
int hoge() throw(なんとか) { ... }
という書式があったんだよ。
0541デフォルトの名無しさん
2010/08/03(火) 08:57:07欲しいよね
0542デフォルトの名無しさん
2010/08/03(火) 10:11:19今から追加するならいっそのこと D のスコープガードにしてほしい。
http://www.kmonos.net/alang/d/2.0/exception-safe.html
http://www.kmonos.net/alang/d/2.0/statement.html#ScopeGuardStatement
0543デフォルトの名無しさん
2010/08/03(火) 12:07:470544デフォルトの名無しさん
2010/08/03(火) 13:57:44template< typename result_type > result_type zero() { return result_type(0); }
そして、関数テンプレートの特殊化で、それぞれの型にあわせたzero()をt作るとします。
template< > int zero< int >() { return 0; } // 例1
template< > float zero< float >() { return 0.0f; } // 例2
template< > double zero< double >() { return 0.0; } // 例3
ある特殊な数を表す special_value< value_type > クラスがあり、
special_value< int > や special_value< char > など無数に定義されているとします。
この special_value< value_type > に対し、zero() を定義したいのですが、
現状だと special_value の具体的なクラスひとつひとつに特殊化を定義しなければならず、大変手間です。
template< > special_value< int > zero< special_value< int > >() { return 0; } // <-これが無数に必要
出来れば、特殊化は special_value< value_type > ひとつだけにして、
尚且つ、zero()の呼び出しも簡素な形にしたいのです。
special_value< int > i = zero(); // <-理想
special_value< int > i = zero< special_value< int > >(); // <-現実 少なくともこれ以上、呼び出し文を複雑にしたくない
関数テンプレートの特殊化は少なく、呼び出しは簡素な良い方法はないでしょうか?
0545デフォルトの名無しさん
2010/08/03(火) 18:01:00struct {
template <typename T>
T operator()() const { return 0; }
} const zero = {};
0546デフォルトの名無しさん
2010/08/03(火) 18:46:30どうもコンパイルエラーがでる…
struct {
template <typename T> operator T () const { return 0; }
} const zero = {};
として、
special_value<int> i = zero;
だと、OK だった。
0547デフォルトの名無しさん
2010/08/03(火) 18:52:24>>546
結局、
struct zero {
template <typename T> operator T () const { return 0; }
};
とすれば、
special_value< int > i = zero();
で、いける。
0548デフォルトの名無しさん
2010/08/03(火) 20:27:04検証した結果、その方法で全てOKでした。
使わせてもらいます。ありがとうございました。
0549デフォルトの名無しさん
2010/08/04(水) 12:43:14これは素晴らしい。惚れた
C++にこの構文を入れるプリプロセッサとかないものか
0550デフォルトの名無しさん
2010/08/04(水) 13:12:100551デフォルトの名無しさん
2010/08/04(水) 18:58:10素晴らしい日本語だな
0552デフォルトの名無しさん
2010/08/04(水) 19:02:280553デフォルトの名無しさん
2010/08/04(水) 19:54:130554デフォルトの名無しさん
2010/08/05(木) 12:47:030555デフォルトの名無しさん
2010/08/09(月) 19:03:390556デフォルトの名無しさん
2010/08/09(月) 20:34:500557デフォルトの名無しさん
2010/08/09(月) 21:01:080558デフォルトの名無しさん
2010/08/10(火) 07:04:310559デフォルトの名無しさん
2010/08/10(火) 10:42:380560デフォルトの名無しさん
2010/08/19(木) 16:52:530561デフォルトの名無しさん
2010/08/19(木) 17:18:570562デフォルトの名無しさん
2010/08/19(木) 20:00:260563デフォルトの名無しさん
2010/08/19(木) 22:50:13そんな事したら、だれも使わなくなると思うんだな
0564デフォルトの名無しさん
2010/08/20(金) 08:36:220565デフォルトの名無しさん
2010/08/20(金) 11:45:510566デフォルトの名無しさん
2010/08/20(金) 17:58:050567デフォルトの名無しさん
2010/08/20(金) 20:03:46最近はC++スタイルを使うように心がけてる。
0568デフォルトの名無しさん
2010/08/20(金) 20:36:12signed ⇔ 浮動小数点数
共にリテラルなのに処理が違うのは変だと思う。
0569デフォルトの名無しさん
2010/08/21(土) 01:27:270570デフォルトの名無しさん
2010/08/21(土) 01:47:09根っこは腐ってしまったが、周辺は良好。
0571デフォルトの名無しさん
2010/08/21(土) 02:24:40むしろ面倒にしてあるからな
0572デフォルトの名無しさん
2010/08/21(土) 10:22:55最強に難解になることは間違いないかな
0573デフォルトの名無しさん
2010/08/21(土) 10:26:33.h
class hoge { int x; public: int y; void print_xy(); };
.cpp
namespace {
inline private void hoge::print_x() { cout << x << endl; } // privateならprivateに触れる。ただしprivateの拡張メンバか非拡張のメンバからしか呼べない
inline public void hoge::print_y() { cout << y << endl; } // publicならpublicにしか触れない、どこからでも呼べる
}
void hoge::print_xy() { print_x(); print_y(); }
こんな感じで
仕様変えたい時にメンバ増やしてもコンパイル依存性は変わらないから便利だろ
ヘッダもすっきりするしな
0574デフォルトの名無しさん
2010/08/21(土) 12:14:03最強というか、そもそもC++が必要な領域では対抗できる言語が無いからね
Dはまだまだだし
0575デフォルトの名無しさん
2010/08/21(土) 16:41:50それ何年も前の本(ピアソンとか)で
そんなもん非メンバ関数で実装すればいいだろ
って書かれてた気がする
コンパイル依存性を変えないなら仮想関数に適用できなくなるし
しかもその例だと非拡張メンバ関数から拡張メンバ関数を呼び出してて
なお一層気持ち悪い
0576デフォルトの名無しさん
2010/08/21(土) 16:54:34なにかコードを追加しようとしたときに
そのコードがprivateメンバーを使ってて
さらに同じコードをなんども書く必要がある場合は
外部関数じゃできないんだからメンバー関数追加するじゃない普通
でもそのクラスをインクルードしてるファイルが死ぬほどたくさんあったらどうすんのよ
0577デフォルトの名無しさん
2010/08/21(土) 17:03:52設計がおかしいからリファクタリングしろ。
それと、ここは 0x のスレだから、提案されてもない機能の話題はスレ違い。
俺の考えた最強言語の話は自分のブログでやってくれ。
0578デフォルトの名無しさん
2010/08/21(土) 20:01:14そんな簡単にprivateに侵入されたらプライバシーもクソもないじゃない
0579デフォルトの名無しさん
2010/08/21(土) 20:40:42#include <utility>
template <class... X> class Hoge
{
public:
void invoke(X... x)
{
func(x...);
}
template <class... Y> void t_invoke(Y &&... y)
{
func(std::forward<Y>(y)...);
}
private:
void func(X... x)
{
}
};
t_invokeのほうは無駄なく転送してくれそうなのですがinvokeのほうだとコピーコストが発生して困ります
かといって引数の型をX &&...やconst X &..に変更すると引数によってコンパイルエラーが出ます
そして引数の参照性やconst性の組み合わせを網羅してオーバーロードするのも可変長では無理ですしできても現実的じゃありません
何とかしてinvokeのほうでも無駄なコピーのない転送を実現したいんですがどうすればいいんでしょうか?
最終的にinvokeを関数ポインタにしたいのでどうしてもtemplateは使えないんです
0580デフォルトの名無しさん
2010/08/21(土) 20:46:13const X &で困るのってどんなとき?
0581579
2010/08/21(土) 21:16:43可変長引数にも普通にメタ関数使ってtypename foo<X>::type...って感じでコンパイル通るんですね
>>580
Hoge<int &>とかHoge<int &&>だとconst参照ではエラーがでますね
0582デフォルトの名無しさん
2010/08/22(日) 10:56:0230バイトぐらいでもかまいません
0583デフォルトの名無しさん
2010/08/22(日) 19:26:48確認はしていない
const uint64_t key = 0x104C11DB7;
constexpr uint32_t CRC32_subsub(uint64_t n, int b)
{
return b==0 ?
n :
CRC32_sub( ( (n & 0x8000000000000000) ? n ^ (key<<31) : n) << 1, b-1);
}
constexpr uint32_t CRC32_sub(uint32_t head, uint32_t tail[], int tlen)
{
return tlen==0 ?
head :
CRC32_sub( CRC32_subsub( ((uint64_t)*head<<32) | tail[0], 32), &tail[1], tlen-1);
}
constexpr uint32_t CRC32(uint32_t input[], int len)
{
return CRC32_sub(input[0], &input[1], len-1);
}
0584デフォルトの名無しさん
2010/08/22(日) 21:32:090585デフォルトの名無しさん
2010/08/22(日) 21:42:250586デフォルトの名無しさん
2010/08/22(日) 21:52:380587デフォルトの名無しさん
2010/08/22(日) 21:55:160588デフォルトの名無しさん
2010/08/22(日) 22:02:51こう書けばよい
0589デフォルトの名無しさん
2010/08/22(日) 22:08:330x000000000485c77a
とか表示されるの拷問
0590デフォルトの名無しさん
2010/08/22(日) 22:29:190x\
8000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
8000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
0000\
やだよこんなの
0591デフォルトの名無しさん
2010/08/22(日) 22:58:370592デフォルトの名無しさん
2010/08/23(月) 03:06:110x80::01で0x8000000000000001になる的な。
0593デフォルトの名無しさん
2010/08/23(月) 03:12:100594デフォルトの名無しさん
2010/08/25(水) 01:51:350595デフォルトの名無しさん
2010/08/25(水) 02:12:420596デフォルトの名無しさん
2010/08/25(水) 02:14:44現行の規格でも関数テンプレートならいけたはず。
何か具体的に通らなくて困ってるコードでもあるの?
0597デフォルトの名無しさん
2010/08/25(水) 02:29:37何バイト長の値が返されるの?
0598デフォルトの名無しさん
2010/08/25(水) 15:15:08この問題ですんごいはまってた。
そうか、仕様だったのか・・・
0599デフォルトの名無しさん
2010/08/25(水) 15:58:50コンパイラ上にだけ存在する常にvoidしか入らない0バイト長の型とか?
理論上の存在意義は分からんでもないが現実に嬉しいかというと微妙だなぁ
0600デフォルトの名無しさん
2010/08/25(水) 16:19:180601デフォルトの名無しさん
2010/08/25(水) 18:31:03void型の返値を受け取ってvoid型の変数に格納してvoid型の引数を取る関数に渡すとか有りか
最終的に評価が発生するところだけvoid型で特殊化できるという意味で理論上の適応はあるな
誰が得するのか知らんが
0602デフォルトの名無しさん
2010/08/25(水) 22:07:590603デフォルトの名無しさん
2010/08/25(水) 22:44:130604デフォルトの名無しさん
2010/08/25(水) 22:50:380605デフォルトの名無しさん
2010/08/26(木) 01:34:130606デフォルトの名無しさん
2010/08/26(木) 01:40:03何かしらの値を返す、
ただ、void型の場合はその値に意味なんてないですよ
ってんだと俺は勝手に思っていた。
そして、コンパイラがその値を参照しようとすると
コンパイルエラーになるようにしているんだと思っていた。
0607デフォルトの名無しさん
2010/08/26(木) 04:42:090608デフォルトの名無しさん
2010/08/27(金) 01:39:06void func()
{
return func2();
}
これができるとテンプレートとかでvoidだけ例外処理する必要なくなるので嬉しい。
0609デフォルトの名無しさん
2010/08/27(金) 08:33:230610デフォルトの名無しさん
2010/08/28(土) 02:32:30すこしコードがすっきりしたぜ。
0611デフォルトの名無しさん
2010/08/28(土) 22:08:27> News 2010-08-28: The 2010-07 post Rapperswil mailing is available
> News 2010-08-28: The C++ Standard Core Language Issues List (Revision 72) is available
0612デフォルトの名無しさん
2010/08/28(土) 22:11:46> Added new issues 1091, 1092, ... and 1173.
3週間ほどで追加されすぎw
0613デフォルトの名無しさん
2010/08/29(日) 10:24:320614デフォルトの名無しさん
2010/08/29(日) 17:52:510615デフォルトの名無しさん
2010/08/29(日) 19:49:220616デフォルトの名無しさん
2010/08/29(日) 22:26:08スローインから再開です
0617デフォルトの名無しさん
2010/08/30(月) 19:43:12http://www.asahi.com/science/update/0830/TKY201008300162.html
0618デフォルトの名無しさん
2010/08/30(月) 19:59:37attributeとは一体何だったのか
0619デフォルトの名無しさん
2010/08/30(月) 20:13:11なんか見出しがgigazineだなw
0620デフォルトの名無しさん
2010/08/30(月) 21:54:190621デフォルトの名無しさん
2010/08/30(月) 22:22:090622デフォルトの名無しさん
2010/08/30(月) 22:27:48Bなんとかの禿=尊称
0623デフォルトの名無しさん
2010/09/02(木) 03:06:04~~
0624デフォルトの名無しさん
2010/09/02(木) 05:40:370625デフォルトの名無しさん
2010/09/02(木) 08:14:470626デフォルトの名無しさん
2010/09/02(木) 08:23:39delete[] で両方開放できるんだっけ??
0627デフォルトの名無しさん
2010/09/02(木) 08:35:390628デフォルトの名無しさん
2010/09/02(木) 09:14:360629デフォルトの名無しさん
2010/09/02(木) 10:47:24なるほど
0630デフォルトの名無しさん
2010/09/02(木) 18:39:10どう見てもお前が流れを理解してない
0631デフォルトの名無しさん
2010/09/02(木) 20:20:29void swap(Hoge& rhs) {}
Hoge& operator=(Hoge&& rhs) {
swap(rhs);
}
上記のコードのように、右辺値参照である rhs を 非const参照を受け取る swap に渡すことは仕様的に合法なのでしょうか?
0632デフォルトの名無しさん
2010/09/02(木) 21:22:39やっぱC++標準化委員会のひとはいうことが違うな
0633デフォルトの名無しさん
2010/09/02(木) 21:58:29何か変なこと言っている??
> やっぱC++標準化委員会のひとはいうことが違うな
0634デフォルトの名無しさん
2010/09/02(木) 22:07:02こんなんよく見つけるな。面白いねー。
0635デフォルトの名無しさん
2010/09/02(木) 22:12:45くだらない記事はるなよ
0636デフォルトの名無しさん
2010/09/04(土) 20:15:280637デフォルトの名無しさん
2010/09/09(木) 16:43:35どうせ暇でしょ。
0638デフォルトの名無しさん
2010/09/09(木) 19:13:05どれ?
0639デフォルトの名無しさん
2010/09/10(金) 08:07:07http://hibari.2ch.net/test/read.cgi/tech/1280914463/473-478
http://hibari.2ch.net/test/read.cgi/tech/1280914463/500-501
http://hibari.2ch.net/test/read.cgi/tech/1280914463/568-582
http://hibari.2ch.net/test/read.cgi/tech/1280914463/590
0640デフォルトの名無しさん
2010/09/11(土) 01:21:27つまり、これが C++0x なら通るのか?って話だね。
#include <cassert>
struct Boo
{
Boo() : b(111) {}
int b;
};
struct Foo
{
Boo boo;
int f;
};
Foo foo[100] = {0};
int main()
{
for (int i = 0; i < 100; ++i)
{
assert(foo[i].f == 0);
assert(foo[i].boo.b == 111);
}
return 0;
}
cygwin の g++ 4.3 だと、まだ initializer list の対応が入ってなくて試せない。
0641デフォルトの名無しさん
2010/09/11(土) 01:34:07それは通らない。
なぜならば、Fooの最初のデータメンバーであるBooは、0では初期化できない。
Boo boo = 0 ; // エラー
よって、次の文もエラーとなる
Foo foo[100] = {0}; // エラー
これなら通る
Foo foo[100] = { } ;
0642デフォルトの名無しさん
2010/09/11(土) 01:37:20ttp://cpplover.blogspot.com/2010/09/aggregate.html
0643デフォルトの名無しさん
2010/09/11(土) 02:44:21だよな。
↓こいつ何言ってるんだろう?
http://hibari.2ch.net/test/read.cgi/tech/1280914463/572
0644デフォルトの名無しさん
2010/09/11(土) 02:47:58> MSVCは、「'A::b' : non-aggregates cannot be initialized with initializer list」などというエラーを吐く。
> これは、規格上間違っている。
これ、 C++2003 では正しいエラーだよね。
> この分では、C++0xの初期化リストの対応も、あまり期待できそうにはない。
まだ対応してないんなら、上記のエラーで当然だと思う。
0645デフォルトの名無しさん
2010/09/11(土) 10:31:430646デフォルトの名無しさん
2010/09/11(土) 11:10:42{
func(forward<X>(x));
}
これをC++03でやろうとしたら
template <class X> void forward_test(X & x)
{
0647デフォルトの名無しさん
2010/09/11(土) 11:12:20template <class X> void forward_test(X && x)
{
func(forward<X>(x));
}
これをC++03でやろうとしたら
template <class X> void forward_test(X & x)
{
func(x);
}
template <class X> void forward_test(X const & x)
{
func(x);
}
template <class X> void forward_test(X volatile & x)
{
func(x);
}
template <class X> void forward_test(X const volatile & x)
{
func(x);
}
見たいな感じで列挙するしかないの?
0648デフォルトの名無しさん
2010/09/11(土) 12:48:140649デフォルトの名無しさん
2010/09/11(土) 13:30:14boostにc++03でムーブするライブラリあるし
右辺値参照は単に書きやすさの問題
0650デフォルトの名無しさん
2010/09/11(土) 13:31:390651デフォルトの名無しさん
2010/09/11(土) 13:36:160652デフォルトの名無しさん
2010/09/11(土) 13:55:510653デフォルトの名無しさん
2010/09/11(土) 14:09:140654デフォルトの名無しさん
2010/09/11(土) 21:04:06const、volatile修飾で動作を変えないなら後ろの2つは要らないんじゃない?
0655654
2010/09/11(土) 21:06:380656デフォルトの名無しさん
2010/09/11(土) 21:24:120657654
2010/09/12(日) 00:32:47最初のテンプレートしかなければ
X const &
X volatile &
X const volatile &
全部最初のにマッチするでしょ?
0658デフォルトの名無しさん
2010/09/12(日) 01:04:05がとれないよ
どうもforward_test<Hoge>って認識されるっぽい
0660デフォルトの名無しさん
2010/09/15(水) 09:20:51constなlvalueリファレンスでrvalueを束縛できるのが、そもそもおかしいんだよ。
0661デフォルトの名無しさん
2010/09/15(水) 13:27:260662デフォルトの名無しさん
2010/09/15(水) 14:54:51君がそれで苦労したと言いたいのか?
レベル低すぎ
0663デフォルトの名無しさん
2010/09/15(水) 14:58:50{
Bar bar;
Baz baz;
};
Foo foo;
Foo fooo(move(foo));
ってやった場合fooo.barとfooo.bazのコンストラクタは右辺値参照のやつが呼ばれるって決まってるの?
0664デフォルトの名無しさん
2010/09/15(水) 15:07:48絶対呼ばれない
0665デフォルトの名無しさん
2010/09/15(水) 17:33:370666デフォルトの名無しさん
2010/09/15(水) 18:12:080667デフォルトの名無しさん
2010/09/15(水) 20:22:51Foo& operator=(Foo&&) = default;
とクラス定義中に書いとけばいいんじゃね?
0668デフォルトの名無しさん
2010/09/15(水) 20:47:560669デフォルトの名無しさん
2010/09/15(水) 21:03:070670デフォルトの名無しさん
2010/09/16(木) 11:12:39explicit class Hoge;
構文があればいいのに
0671デフォルトの名無しさん
2010/09/16(木) 13:26:59根本的なところから理解出来てない
あのね、無理して使わなくていいんだよ、お前らには無理
0672デフォルトの名無しさん
2010/09/16(木) 13:32:19くだらないこといってる暇があったら質問に答えるなり解説するなりしたらどうなの?奴隷階級が生意気だよ
0673デフォルトの名無しさん
2010/09/16(木) 14:20:35他人に言う前に、自問自答すればいいのに。
酔っぱらいが「酔っぱらいは嫌いだ」って言ってるのと同じだろw
0674デフォルトの名無しさん
2010/09/17(金) 09:53:29ユーザー定義のコピーコンストラクタがなくて、
かつムーブコンストラクタが暗黙にデリートされなければ、
ムーブコンストラクタが暗黙に定義される。
12.8.17 節:
暗黙のムーブコンストラクタは、メンバーごとにムーブを行う。
これだけ読むと >>669 は正しい気がする。
0675デフォルトの名無しさん
2010/09/17(金) 09:56:050676デフォルトの名無しさん
2010/09/17(金) 10:01:49明示的にデリートじゃないの?
0677デフォルトの名無しさん
2010/09/17(金) 11:08:35多分↓のことだと思う>暗黙にデリート
12.8.12 節: コピー/ムーブコンストラクタは(中略)の場合、デリートされる。
あと、デフォルトのムーブコンストラクタのみだと、
最終的には
「スカラー型は組み込みの代入演算子で初期化される」 (12.8.17)
に行きつくので、コピーするのと結局変わらない。
0678デフォルトの名無しさん
2010/09/18(土) 22:27:30exportとは違うんですか?
explicit instantationとも違うんですか?
全部ex.*で始まってて同じに見えます!!
0679デフォルトの名無しさん
2010/09/19(日) 00:51:130680デフォルトの名無しさん
2010/09/19(日) 01:04:090681デフォルトの名無しさん
2010/09/19(日) 01:14:440682デフォルトの名無しさん
2010/09/19(日) 01:16:300683デフォルトの名無しさん
2010/09/19(日) 01:43:000684デフォルトの名無しさん
2010/09/19(日) 21:50:59コンパイル時に enum の全要素はわかってるんだから
begin/end を適当に決定して内部的によろしくやってくれて
range-based for 文を使えるようにしてくれてもいいだろうと思わないでもない。
unroll も簡単にできるだろうし。ただ、型を直接置けないから
enum X {...}; とある場合、for (X x: X{}) とでもすればいいのかな。
0685デフォルトの名無しさん
2010/09/19(日) 22:12:510686デフォルトの名無しさん
2010/09/19(日) 23:27:240687デフォルトの名無しさん
2010/09/19(日) 23:29:070688デフォルトの名無しさん
2010/09/19(日) 23:34:530689デフォルトの名無しさん
2010/09/19(日) 23:39:55みたいなことが書いてあったと思う
それを受けてD&Eにも「Cのenumがテキトーすぎてクソまみれなので、仕方なくC++で少しクソを拭うことになった。ちくしょう」みたいなことが書いてある
あと「どうせお前らが欲しいのはこれだろ→enum BOOL{FALSE,TRUE}。bool使え」とか
0690デフォルトの名無しさん
2010/09/19(日) 23:47:56あるいは関数型言語のバリアントかと思うんだけど、どうしてこうなった
0691デフォルトの名無しさん
2010/09/20(月) 02:24:35static な定数用に class を自分で定義すればいいだけ
0692デフォルトの名無しさん
2010/09/20(月) 02:30:240693デフォルトの名無しさん
2010/09/20(月) 08:39:15あるとかなり便利になると思うんだが
実装難しいのかな?
0694デフォルトの名無しさん
2010/09/20(月) 10:37:44おいらはBOOST_FOREACHをforeachに#defineして使ってる。カウンタ変数にautoも使えて便利でござる。
0695デフォルトの名無しさん
2010/09/20(月) 12:46:48というかMSVCはC++コンパイラとして未来がないと思う。
どんなバグ報告をしようと、
「それは些細な問題だから、次のリリースでも直す予定はない」
ときたもんだ。
MSVCはもはや、C++コンパイラ界のIEみたいなもんだぜ。
0696デフォルトの名無しさん
2010/09/20(月) 12:55:410697デフォルトの名無しさん
2010/09/20(月) 17:25:46商用コンパイラではなかなか難しいからなぁ。
0698デフォルトの名無しさん
2010/09/20(月) 17:38:120699デフォルトの名無しさん
2010/09/20(月) 18:21:580700デフォルトの名無しさん
2010/09/20(月) 18:24:05どこかで、「コンセプトマップを書くのが面倒くさい」というような記事を読んだことがあるが、
そのあたりの詳細に詳しい人いる?
一般のプログラマも、コンセプトマップを書くことになるのは分かるのだが、
そのことが、コンセプトを規格から外す理由になった経緯が分からん。
だって、一般のプログラマは、そんなに頻繁にコンセプトマップ書くとは思えないから
0701デフォルトの名無しさん
2010/09/20(月) 18:32:25書くのが面倒くさいからどうこうという浅い理由じゃないよ
0702デフォルトの名無しさん
2010/09/20(月) 18:42:04とはいうもののconcept_checkingだけでも十分便利だから期待はできそうか
0703デフォルトの名無しさん
2010/09/20(月) 19:04:490704デフォルトの名無しさん
2010/09/20(月) 19:26:52一応VCは拡張 for each in があるよね?
0x に提案されてるのとちょっと文法違うけど
0705デフォルトの名無しさん
2010/09/20(月) 19:32:310706デフォルトの名無しさん
2010/09/20(月) 19:38:25Please don't use the non-Standard "for each" extension. It has nasty gotchas.
http://blogs.msdn.com/b/vcblog/archive/2010/07/02/video-introduction-to-the-stl-part-1.aspx
0707デフォルトの名無しさん
2010/09/20(月) 23:42:330708デフォルトの名無しさん
2010/09/23(木) 16:43:42そんなの昔からだ
VC6 ≒ IE6
0709デフォルトの名無しさん
2010/09/23(木) 20:52:46書いてない場合はムーブ禁止みたいなオプションないのかな
0710デフォルトの名無しさん
2010/09/23(木) 22:17:22禁止させるならX(X&&) = delete; ただしVC2010は(ry
0711デフォルトの名無しさん
2010/09/24(金) 00:02:18デフォルトのムーブ動作はコピーすることだし、
コンストラクタ呼び出しが省略される条件もコピーコンストラクタと同じ。
0712デフォルトの名無しさん
2010/09/24(金) 00:58:34デフォルトコピーされるのも考え物だけど
0713デフォルトの名無しさん
2010/09/24(金) 01:06:59ただし、その「ムーブ」とやらは、単に組み込みの代入演算子を呼び出すだけだが。
まあ、メンバーは、普通はポインターじゃなくて、unique_ptrで持つわな。
0714デフォルトの名無しさん
2010/09/24(金) 12:01:12Bjarneの頭は必然だったわけか…
0715デフォルトの名無しさん
2010/09/24(金) 20:44:12(例えばストリームクラスなど)
そこで質問ですが、
[コピー可能クラスの集合] ⊂ [ムーブ可能クラスの集合]
(つまり、コピー可能ならば、常にムーブ可能か)
ですか?それとも
[コピー可能クラスの集合] と [ムーブ可能クラスの集合] は無関係
(つまり、コピー可能性とムーブ可能性は無関係か)
ですか?
0716デフォルトの名無しさん
2010/09/24(金) 21:01:36X(X&&) = delete;
X& operator=(const X&) = default
X(const X&) = default
};
0718デフォルトの名無しさん
2010/09/24(金) 23:44:03自分の設計する全クラスに用意しなくてもいいんだよね?
用意してやることで効率が改善されると考えられる自作クラスにのみ
用意してあげればいいんだよね??
0719デフォルトの名無しさん
2010/09/24(金) 23:59:320720デフォルトの名無しさん
2010/09/25(土) 12:58:460721デフォルトの名無しさん
2010/09/25(土) 13:06:390722デフォルトの名無しさん
2010/09/25(土) 13:07:080723デフォルトの名無しさん
2010/09/25(土) 13:27:35ムーブも出来るのかもしれないけど禁止だね
0724デフォルトの名無しさん
2010/09/25(土) 13:30:260725デフォルトの名無しさん
2010/09/25(土) 13:31:550726デフォルトの名無しさん
2010/09/25(土) 13:56:36理想も結構だけど、勝手に古いコード壊すなよ
0727デフォルトの名無しさん
2010/09/25(土) 15:36:43テンプレートでラッパー作ればpimpl化なんて即終了ですよね
ひとつひとつ修正するとか笑わせないでくださいよwww
0728デフォルトの名無しさん
2010/09/25(土) 15:47:50バ カ
0729デフォルトの名無しさん
2010/09/25(土) 15:53:02別にそれでいいんじゃね?
「既存クラスのほとんど」ってのは疑問だがな。
0730デフォルトの名無しさん
2010/09/25(土) 16:19:240731デフォルトの名無しさん
2010/09/25(土) 18:23:16ポインタを素で置いてるのはバグの元。unique_ptrやshared_ptrやboost::scoped_ptrを使おうぜ。
コピーやムーブの可否が自動的に適用されるよ
0732デフォルトの名無しさん
2010/09/25(土) 18:26:21実用品を作ってる職業プログラマーはスマートポインターを使うべきだと思うけどね。
0733デフォルトの名無しさん
2010/09/25(土) 18:38:58いまいちリッチなポインタ使う動機がない
0734デフォルトの名無しさん
2010/09/25(土) 18:39:070735デフォルトの名無しさん
2010/09/25(土) 18:40:140736デフォルトの名無しさん
2010/09/25(土) 18:50:53逆だろ。RAII こそ芸術。
0737デフォルトの名無しさん
2010/09/25(土) 19:08:31実用コードでは全く使い物にならないという意味で
0738デフォルトの名無しさん
2010/09/25(土) 19:11:010739デフォルトの名無しさん
2010/09/25(土) 19:15:41何も考えずに解放が必要な物にホイホイ使ってるなら危なすぎるから今すぐ止めろ
0740デフォルトの名無しさん
2010/09/25(土) 19:19:36スコープ内の一時利用で済むような機能はリソース獲得関係なくRAIIにするでしょ。
0741デフォルトの名無しさん
2010/09/25(土) 19:20:250742デフォルトの名無しさん
2010/09/25(土) 19:23:090743デフォルトの名無しさん
2010/09/25(土) 19:26:270744デフォルトの名無しさん
2010/09/25(土) 19:28:07RAIIは「リソース解放は絶対に失敗しない」という仮定に全面的に依存している
そして大抵のリアルなリソースはそうではない
けど「RAIIは素晴らしいからみんな使おう^^」とか言ってる無責任な本やwebの多くはそんなこと触れてない
そのせいで間違った利用が横行している
恐ろしい
0745デフォルトの名無しさん
2010/09/25(土) 19:30:240746デフォルトの名無しさん
2010/09/25(土) 19:32:05お前ら、beginXXX() 〜 endXXX() とかやるときあるだろ
そういうのに使えないか確認してみよう
0747デフォルトの名無しさん
2010/09/25(土) 19:33:20安易にRAIIを使う前に確認してみよう
0748デフォルトの名無しさん
2010/09/25(土) 19:34:160749デフォルトの名無しさん
2010/09/25(土) 19:34:47ほう、そのプログラムは解放に失敗したファイルやロックを自分が終わるまで握り込むのか
はた迷惑なプログラムだな
0750デフォルトの名無しさん
2010/09/25(土) 19:37:31fstreamは万死に値する
0751デフォルトの名無しさん
2010/09/25(土) 19:41:56お前の実行環境が分からんが
解放が失敗したリソースはどうすればいいんだ?
もう一度解放を試みるのか?
0752デフォルトの名無しさん
2010/09/25(土) 19:45:03失敗の仕方次第だろ
戻り値やerrnoを見てしかるべき処置を執る
もう一度解放が必要かもしれないし、解放不要でそのまま正常系に戻れるかもしれないし、致命傷でプログラムを落とす必要があるかもしれない
実用的プログラムを謳うならそこまでちゃんとしないとね
0753デフォルトの名無しさん
2010/09/25(土) 19:46:46それに失敗したときはassertする時って事わりと多くね。
0754デフォルトの名無しさん
2010/09/25(土) 19:56:34釣り乙
0xだとλがあるからscope exit風な処理もマクロで実装出来るね
と無理矢理0xに繋げるテスト
0755デフォルトの名無しさん
2010/09/25(土) 20:03:110756デフォルトの名無しさん
2010/09/25(土) 22:15:350757デフォルトの名無しさん
2010/09/26(日) 00:12:55失敗時のハンドラを登録できるRAIIを用意すればいんじゃね?
失敗が怖いからRAIIを使わないってのは怖がりすぎな気が
hoge_ptr<T> hoge = ...;
hoge.set_handler([](){
// リソースの解放失敗時に呼び出される
});
0758デフォルトの名無しさん
2010/09/26(日) 00:42:080759デフォルトの名無しさん
2010/09/26(日) 00:42:29そのための例外だね
>>757
例外のほうがすっきりすると思うよ。
0760デフォルトの名無しさん
2010/09/26(日) 00:53:09RAII解放時のエラー処理の話なんだから例外使うとまずい。
デストラクタで例外はC++的にヤバすぎて使えない。
だからハンドラ作って処理させるという逃げの一手にしてるわけで
0761デフォルトの名無しさん
2010/09/26(日) 00:53:50× >>757
○ >>759
0762デフォルトの名無しさん
2010/09/26(日) 00:57:03デリーターをラップしてその中で処理しろよ
0763デフォルトの名無しさん
2010/09/26(日) 01:05:32リソース開放でエラーってヒープ破壊のようなクラッシュ直前のよっぽど異常な状態だろう。
0764デフォルトの名無しさん
2010/09/26(日) 01:07:14あー確かにそのとおりだわ。
ハンドラ作るより素直だし良いコードになるね。
うーん何で思いつかなかったんだろ。自分の頭の硬さが嫌になるわ。
0765デフォルトの名無しさん
2010/09/26(日) 01:12:090766デフォルトの名無しさん
2010/09/26(日) 01:14:59ネットワーク越しのファイルとかみたいに
割と日常的にclose(というより正確にはclose時のflush)に失敗しそうなものがあるから困る。
しかも時間をおけば成功しそうだから下手に握りつぶすのも悪手な感じだし。
まぁそんなわけでリソース解放の失敗は別にレアケースではないよと。
0767デフォルトの名無しさん
2010/09/26(日) 01:21:250768デフォルトの名無しさん
2010/09/26(日) 01:26:39で、そのRAII以外の方法はデストラクタに入れられない?
0769デフォルトの名無しさん
2010/09/26(日) 01:38:48デストラクタでやるメリットはスコープ抜けるタイミングを気にしなくていいとこだかんね
デストラクタ内でリトライしてもいいし、ログってもいいし、無視してもいいし、アプリをアボンしてもいい
デストラクタの中で普段やってるリソース開放処理をやるだけ
ただし成功するまでリトライみたいな無限ループと例外だけは使ってはいけない
0770デフォルトの名無しさん
2010/09/26(日) 01:58:40解放失敗がクリティカルだったり失敗することが多い状況では
そのメンバ使った明示的解放と失敗時の処理をすればいい。
そんなことシラネってやつが何も考えずにRAII使っても
リソース解放処理が自動で行われる(成否はともかく)という点で
生ポインタや生ハンドル使って解放忘れてリークおこすよりマシって話じゃないの。
0771デフォルトの名無しさん
2010/09/26(日) 02:12:03明示的開放が用意されてるってことはdtorでの自動処理では問題が起こる可能性があるってこと
dtorでの開放は危険性がまだ残ったままなのに安全に処理しているような錯覚を生み出す
危険性を認知していないまま安全だと思い込むことはただのうっかりよりも恐ろしい(様々な分野で致命的な事故が起こる原因の多くは間違った安心感からだ)
本来ならばdtorでリソースの生死を判断して生きているならassertするべきなんだよね
0772デフォルトの名無しさん
2010/09/26(日) 02:14:48「表明」だよ
0773デフォルトの名無しさん
2010/09/26(日) 02:18:49「適切な開放処理を経由している」って条件を表明してるんじゃん
0775デフォルトの名無しさん
2010/09/26(日) 11:38:420776デフォルトの名無しさん
2010/09/26(日) 11:43:330777デフォルトの名無しさん
2010/09/26(日) 12:04:33入門書とかひたすら「便利でしょ!」みたいな感じだから、みんな勘違いしたままになる。
0778デフォルトの名無しさん
2010/09/26(日) 12:35:01落とし穴を巧妙に一生懸命
作ってるようなもんだよなあ
0779デフォルトの名無しさん
2010/09/26(日) 12:50:20何とかならないのか
0780デフォルトの名無しさん
2010/09/26(日) 12:53:11被せた方が安全かもしれないけど
後処理が出来てれば生の方が
気持ちいいし絶対生。
0781デフォルトの名無しさん
2010/09/26(日) 12:55:070782デフォルトの名無しさん
2010/09/26(日) 12:58:50例外巻き戻し中に例外を投げたときのエレガントな動作を定義してくれればデストラクタでの例外が可能になるよ。
デストラクタはリソース開放しかしないようにすれば例外投げる必要はなくなるんだよね。
0783デフォルトの名無しさん
2010/09/26(日) 13:11:19失敗しないリソース解放なんてfreeとdeleteくらいだというのに
0784デフォルトの名無しさん
2010/09/26(日) 13:15:50つまりRAIIと例外処理は相補的でC++の設計が理にかなってることを示している
0785デフォルトの名無しさん
2010/09/26(日) 13:17:210786デフォルトの名無しさん
2010/09/26(日) 13:20:56ん、俺か?
俺は 雷ッ だな
0787デフォルトの名無しさん
2010/09/26(日) 13:23:110788デフォルトの名無しさん
2010/09/26(日) 17:22:22現在大きな問題になってる解放忘れによるリークをなくすことが第一。
その後で解放失敗によるリークが無視できない問題になれば
ハードウェアやOSの設計レベルでのリソース管理法の見直しも含めて新たな手法が考案されるよ。
0789デフォルトの名無しさん
2010/09/26(日) 17:40:35RAIIを使って開放されてしまう間違いも同等に起きるから
どっちもどっちとしか言わざるをえない。
0790デフォルトの名無しさん
2010/09/26(日) 17:43:15解放しないクラスを作ればいいだけだろ
0791デフォルトの名無しさん
2010/09/26(日) 17:46:49いやそれは設計がおかしいだろw
0792デフォルトの名無しさん
2010/09/26(日) 20:26:16>>766が言ってるclose時のflushはリソース解放じゃないし。
0793デフォルトの名無しさん
2010/09/26(日) 20:42:51792はファイル扱う時に常にflushしてからflushしないcloseをしてるの?
0794デフォルトの名無しさん
2010/09/26(日) 21:03:11ってのもどうなんだろうな?
0795デフォルトの名無しさん
2010/09/26(日) 21:09:05RAIIを使わない理由にはならない
0796デフォルトの名無しさん
2010/09/26(日) 21:22:18closeの失敗としてバッファの値を何らかの原因で書き出せなかった場合か?
こんなのOSが悪いんでC++の知ったことじゃない。例としてWinが時々出す遅延書き込みの失敗でシステムのイベントとして記録される。
それでもRAIIとしてはファイルハンドルを閉じてしまえば責任を果たしたことになるだろう。
0797デフォルトの名無しさん
2010/09/26(日) 21:22:54I/Oエラーでflashに失敗しcloseがエラーを返した場合でもリソースは解放される。
少なくともリークは起こらない。
RAIIを使わないで信頼性/保守性の悪いコード書くよりは最後のデータをwrite
した後に明示的にflushするようにする方がマシだと思う。
0798デフォルトの名無しさん
2010/09/26(日) 21:30:37おいらはclose明示すればファイルを残し、closeされずにデストラクトされたらファイルを消すようにしてる。
これなら例外で抜けてもごみは残らない。
0799デフォルトの名無しさん
2010/09/26(日) 21:30:53管理しなきゃいけないものが複数出てきたとき
RAIIなしじゃ面倒そう
それこそ保守性の悪いコードが出てきそう
0800デフォルトの名無しさん
2010/09/26(日) 21:32:50>>798はそのRAII+明示処理の考え方。すっきりする。
0801デフォルトの名無しさん
2010/09/26(日) 21:55:49大事なデータの書き損じを、RAIIだと検知できないからって正常系に戻しちゃっといて
「OSが悪い。C++の知ったことじゃない。ファイルハンドル閉じたから責任を果たした」ってか。
おー怖い。絶対に他人様が使うプログラム書くなよ。
0802デフォルトの名無しさん
2010/09/26(日) 22:14:01遅延書き込みの失敗を受け取る方法を教えてくれ。
0803デフォルトの名無しさん
2010/09/26(日) 23:13:57だから例外や返却値に頼るのでなくハンドラを渡してコールバックしてもらえとあれほど…?…誰も言ってないな
0804デフォルトの名無しさん
2010/09/26(日) 23:24:370805デフォルトの名無しさん
2010/09/26(日) 23:58:31現在の処理進行度と結果を示してる何かをポーリングで監視。
0806デフォルトの名無しさん
2010/09/27(月) 00:04:32知ったか乙
0808デフォルトの名無しさん
2010/09/27(月) 05:29:27Windowsとか遅延書き込みに反応するためのAPIまであるし。
0809デフォルトの名無しさん
2010/09/27(月) 10:03:43趣味のプロブラムならそれでいい
商用ならクビ
0810デフォルトの名無しさん
2010/09/27(月) 11:49:32無理やり実装しようとするのがそもそもの間違い
RAIIを使いたければJavaでもC#つかえばいい。
0811デフォルトの名無しさん
2010/09/27(月) 11:50:17あなたならどのように実装する?
0812デフォルトの名無しさん
2010/09/27(月) 11:53:130813デフォルトの名無しさん
2010/09/27(月) 11:59:48なんでも実利主義でも儲け主義な企業がわるい。
日本人はもともと巧みで繊細な技術だから
無意味なところにもこだわるべき。
0814デフォルトの名無しさん
2010/09/27(月) 12:48:05すべてを手作業にすべき。
0815デフォルトの名無しさん
2010/09/27(月) 13:47:05RAIIをオンにしたり構文の規則をカタマライズしたり
自分好みのプログラミング言語を作る時代に発展していくんだろうな。
0816デフォルトの名無しさん
2010/09/27(月) 13:49:58こいつ最高にアホ
0817デフォルトの名無しさん
2010/09/27(月) 14:16:40エラーが起きる可能性があることを前提すればよいだけの話
・正常に書き込めたかチェックする(使用した関数の戻り値とかのふざけた方法でなく)
・復旧できる仕組みを用意する
・バックアップを作成する
・データの保存は複数の系統で、重複して行う
趣味のプログラムなら「あららデータなくなっちゃた」で済むけど、
商用では絶対に許されないことだよ
0818デフォルトの名無しさん
2010/09/27(月) 14:21:38つまり fstream の仕様はどうするべきだ(だった)と言うの?
現状の仕様でも、趣味のプログラムならデストラクタ任せで、商用で
データロスが許されないなら明示的に close() して戻り値チェックすれば
いいってことで、問題ないんじゃないの?
0819デフォルトの名無しさん
2010/09/27(月) 14:27:360820デフォルトの名無しさん
2010/09/27(月) 14:28:130821デフォルトの名無しさん
2010/09/27(月) 14:30:080822818
2010/09/27(月) 14:30:59あとで fail() なり !good() なりでチェックするってことで。
0823デフォルトの名無しさん
2010/09/27(月) 14:34:42読み込んで書き込んだデータと一致するか調べないと本当に
正常に書き込めたかは分からないよ?
それでもやるの?
0824デフォルトの名無しさん
2010/09/27(月) 14:36:280825デフォルトの名無しさん
2010/09/27(月) 14:43:56windowsも自己責任だよ
契約書(だれも読まないけど)にちゃんと書いてある
0826デフォルトの名無しさん
2010/09/27(月) 14:48:53printf だってちゃんと出力できたかどうかわからないのに
毎回戻り値ちゃんと見てるのか?
0827デフォルトの名無しさん
2010/09/27(月) 14:49:340828デフォルトの名無しさん
2010/09/27(月) 14:52:22どうみてもPL法違反だよな
0829デフォルトの名無しさん
2010/09/27(月) 14:53:560830デフォルトの名無しさん
2010/09/27(月) 14:55:370831デフォルトの名無しさん
2010/09/27(月) 14:57:160832デフォルトの名無しさん
2010/09/27(月) 15:00:490833デフォルトの名無しさん
2010/09/27(月) 15:57:26そういうのが手間だからやらないとでも?
書き込んだはずのデーターが消失するんですよ?
事の重大性がわかってないんじゃない?
うちの会社なら君はクビだ
0834デフォルトの名無しさん
2010/09/27(月) 15:58:360835デフォルトの名無しさん
2010/09/27(月) 16:02:20馬鹿?
人がやらなくていいようにプログラムがやるんだよ。
0836デフォルトの名無しさん
2010/09/27(月) 16:07:330837デフォルトの名無しさん
2010/09/27(月) 16:15:320838デフォルトの名無しさん
2010/09/27(月) 16:18:18ストリームとじた後に再読込して全体チェックしなきゃいけないんだから段階的にはできないでしょ
0839デフォルトの名無しさん
2010/09/27(月) 16:20:19ハードディスクとハードディスクでチェックすればいいだろ。
0840デフォルトの名無しさん
2010/09/27(月) 16:29:090x の話じゃないよね。
0841デフォルトの名無しさん
2010/09/27(月) 16:47:260842デフォルトの名無しさん
2010/09/27(月) 17:08:43商用アプリ、組み込み系特殊ハード、ゲーム屋くらいかと思ってたけど
そうでもないんか
趣味でWindowsでC++ってなんでそんな茨の道?とか思った
0843デフォルトの名無しさん
2010/09/27(月) 17:13:36ちょっと前までC++でWINとかふつうだったけど、なにかんがえてるの?
0844デフォルトの名無しさん
2010/09/27(月) 18:16:320845デフォルトの名無しさん
2010/09/27(月) 18:17:300846デフォルトの名無しさん
2010/09/27(月) 18:26:53shared_ptrの利用ポリシーにも関わってくるから全く無関係ではない
0847デフォルトの名無しさん
2010/09/27(月) 18:35:03> 趣味でWindowsでC++ってなんでそんな茨の道?とか思った
俺は趣味だけど、
コンパイルできてネイティブコードが出力できたり
ライブラリが(外部のね)充実していたりと
最初に取り組んだ言語がCだったりと
いった理由でC++やってる。
でも0xで辟易している。
仕事じゃないからあんまり余暇をC++0xの勉強だけにつぶしたくないし。
0848デフォルトの名無しさん
2010/09/27(月) 18:36:490xはやれやれだぜってこと?
0849デフォルトの名無しさん
2010/09/27(月) 18:41:580xコンパイラで03コードは(ほぼ)通るんだし
perlやpythonみたいに古いコードが壊されないのがC++のいい所
0850デフォルトの名無しさん
2010/09/27(月) 18:44:490851デフォルトの名無しさん
2010/09/27(月) 18:51:000852デフォルトの名無しさん
2010/09/27(月) 19:56:340853デフォルトの名無しさん
2010/09/27(月) 19:58:430854デフォルトの名無しさん
2010/09/27(月) 20:52:53特にラムダとSTLの相性の良さが癖になる。
どうやってチェックするのかまだわからないんだが。
ファイル読み込みAPIが正常に動作しているという保証がどこにある?
0856デフォルトの名無しさん
2010/09/27(月) 21:52:04ほとんどの03コンパイラでexportは通らなかっただろう
0857デフォルトの名無しさん
2010/09/27(月) 23:11:18書きこんで読み込めたからといってディスクに書かれているとは限らないしなぁ
833の回答が気になるw
0858デフォルトの名無しさん
2010/09/27(月) 23:28:310859デフォルトの名無しさん
2010/09/27(月) 23:34:130860デフォルトの名無しさん
2010/09/27(月) 23:38:400861デフォルトの名無しさん
2010/09/28(火) 00:55:400862デフォルトの名無しさん
2010/09/28(火) 00:58:190863デフォルトの名無しさん
2010/09/28(火) 01:02:470864デフォルトの名無しさん
2010/09/28(火) 01:19:17ファイルやデータベース接続をRAIIで管理したつもりになってる奴は今すぐやめなさい
0865デフォルトの名無しさん
2010/09/28(火) 01:22:20APIがぶっ壊れてる(暴走してる?)ケースと、レアでも何でもちゃんとエラーが返ってきて
アプリ側で対応できるケースは全然別だろ?
0866デフォルトの名無しさん
2010/09/28(火) 01:25:420867デフォルトの名無しさん
2010/09/28(火) 01:30:39はいはい
0868デフォルトの名無しさん
2010/09/28(火) 01:33:080869デフォルトの名無しさん
2010/09/28(火) 01:35:560870デフォルトの名無しさん
2010/09/28(火) 01:39:48で済むじゃん
0871デフォルトの名無しさん
2010/09/28(火) 01:41:210872デフォルトの名無しさん
2010/09/28(火) 01:46:350873デフォルトの名無しさん
2010/09/28(火) 01:59:390874デフォルトの名無しさん
2010/09/28(火) 02:15:37デストラクタ起動した時点でオブジェクトは壊れてるし、例外は当然投げれないんだぞ?
staticメンバとかerrnoとかバカなこと言うなよ
0875デフォルトの名無しさん
2010/09/28(火) 04:29:52でもやり方としては>>757で既出な気がする。
そこでリトライ/中途半端な結果で諦める/ファイルを削除する/独自処理(バックアップから書き戻すetc)を
選べればよいのではなかろうか。
コールバックの中から例外投げられないのは辛そうだけど。
0876デフォルトの名無しさん
2010/09/28(火) 05:42:04失敗が許されるのは、無効なリソースを開放しようとしたときぐらいなものだ。
解放に失敗しても、やれることは皆無だし。
C++が、あらゆる場所で、デストラクターは失敗しないべきだという前提のもとに設計されているのも、当然だ。
それでも失敗するとしたら、それはリソースの解放以外の何かをやろうとしているせいだ。
同期処理では、すぐに処理が終わらないこと、
例えば、他のスレッドやプロセスとの同期やネットワーク越しなど何らかの環境依存の処理をもって、
失敗としているならば、非同期処理でやるべきだ。
例えば、ユーザーが解放処理をした時点で、スレッドやスレッドプールなどで、そのリソースを、いずれ解放するようにする。
少なくとも、解放処理をした時点で、リソースの解放は、ライブラリ(OSなどのシステムも含む)側が責任を持つべきで、
ユーザー側が責任をもつべきではない。
0877デフォルトの名無しさん
2010/09/28(火) 05:45:21解放処理とは失敗すべきではない。
ユーザー側にとっての解放処理を、
ライブラリ側にとっても「解放」と呼ぶ必要はない。
0878デフォルトの名無しさん
2010/09/28(火) 05:50:33アプリ側でできないと困るだろ……
ライブラリはバックアップのファイル名なんて知る訳ないし
0879デフォルトの名無しさん
2010/09/28(火) 05:59:330880デフォルトの名無しさん
2010/09/28(火) 06:02:38それがコールバック関数案だと思うんだが、バックアップからの書き戻し(大抵リネームだけだろうけど)すら
失敗する可能性があるんだよなあ。
そうするとどうしても外に例外を投げるなりしてユーザーにダイアログボックスを見せたい。
まあそこまで作り込むなら、デストラクタじゃなくてflushなりcloseを別関数にしろよ、ってのが正しいと思うw
0881デフォルトの名無しさん
2010/09/28(火) 06:14:26先にリソース確保、その後に使う。でしょ?
同様に、必要とされるメモリは事前に確保。少なくともデストラクタ実行時に発生する動的なメモリ確保は、コンストラクタ内で確保しておく。と。
0882デフォルトの名無しさん
2010/09/28(火) 06:16:28closeを保証するブロックの内側にflushを保証する別のブロックをRAIIで作ればいいんじゃないの?
0883デフォルトの名無しさん
2010/09/28(火) 06:21:22エラーハンドリングしたいときはデストラクタに任せず別関数を呼んでください、のほうが遥かに現実的だな……
大体スタックオーバーフローの可能性もある以上別の関数すら呼べないじゃん……
0884デフォルトの名無しさん
2010/09/28(火) 06:25:36flushを保証するブロックで失敗したら、closeを保証するブロックを抜けた上で
(closeしないとファイルを消すこともできないので)
外側でなんかする、ということになると思うんだが、
closeを保証するブロックを抜ける手段として一番便利なのはどう考えても例外なので
flushがRAIIである必要は全くないと思う。普通のメンバ関数で充分。
0885デフォルトの名無しさん
2010/09/28(火) 06:27:40テンポラリな名前でファイル書き込んで成功時にリネームするもんじゃね?
0886デフォルトの名無しさん
2010/09/28(火) 06:28:00flush を保証するのに RAII 使ったら例外投げれないでしょ。
まとめると、
「 ofstream で書き込み終了したら close() 呼ばないと危ないよ」
で済む話を RAII のせいにしてわめいてるおかしな人が一人、
ってことでおk?
0887デフォルトの名無しさん
2010/09/28(火) 06:30:33ああ、普通はその方が正しいな。
どっちにしろ失敗したファイルは消さないといけないけど
0888デフォルトの名無しさん
2010/09/28(火) 06:31:230889デフォルトの名無しさん
2010/09/28(火) 06:42:26>>885のやり方でいいなら、closeはcloseでリソースリークが起こらないことだけ面倒見て
続行不能なIO例外が飛んできたら一律そこで一時ファイル削除すればいいんじゃないの?
0890デフォルトの名無しさん
2010/09/28(火) 06:49:00いいよ。
でもデストラクタは例外飛ばせないので、やっぱりcloseは明示的に呼ぶことになるね。
あとまあ、ファイルのIDを維持したいとかハードリンクを維持したいとかリソースフォークを維持したいとかで
リネームによる解決ができない場合は時々あると思う
0891デフォルトの名無しさん
2010/09/28(火) 06:57:26書き込み操作が全部終わった時点で手動でflushして失敗したら例外投げたらいいんじゃないの?
0892デフォルトの名無しさん
2010/09/28(火) 06:59:170893デフォルトの名無しさん
2010/09/28(火) 06:59:35つまり、デストラクターの外に例外を飛ばす必要がないのなら、
デストラクターの中でthreadをつくって、join()すればいいじゃん。
0894デフォルトの名無しさん
2010/09/28(火) 07:00:39全然違う
closeは書き込み操作が成功しようが失敗しようが呼ばないといけない
flushはwriteしたいものが全部片付いた時だけ呼べばいい
0895デフォルトの名無しさん
2010/09/28(火) 07:11:49えっ
単に外に飛ばさなければいいだけで、デストラクタの中で握りつぶす分には大丈夫と思ってたけど
もしかして違うのか……怖くなってきた
0896デフォルトの名無しさん
2010/09/28(火) 07:15:050897デフォルトの名無しさん
2010/09/28(火) 07:27:57ある程度書き込んだあとflush到達前に例外が飛んだ場合でなおかつdisk fullなら、
デストラクタ経由close経由flushがやっぱり失敗するんでどっちにしろ明示的に……と
書こうとしたが、この場合はもみ消していいのか。すまん。
0898デフォルトの名無しさん
2010/09/28(火) 07:32:52デストラクターの中で例外を使うというのは、問題になる。
例外を投げた結果、デストラクターが実行されているとしたらどうなる?
struct S
{
~S()
{
try {
throw 0 ;
} catch(...) { }
}
} ;
void f()
{
S s ;
throw 0 ;
// sのデストラクターを呼び出す
}
この例では、S::~S()の外には例外を投げないものの、
すでに例外が発生しているので、デストラクター内のthrow文を実行した時点で、
例外が重複することになり、エラーとなる。
したがって、例外を投げたことによるデストラクターの実行ではない保証できる場合でしか、
デストラクターの中で、安全に例外を使うことはできない。
0899898
2010/09/28(火) 07:38:510900デフォルトの名無しさん
2010/09/28(火) 07:42:44あとの処理は誰かに任せる
0901デフォルトの名無しさん
2010/09/28(火) 07:58:37どうやって?
何を使えば伝えられるのか?
0902デフォルトの名無しさん
2010/09/28(火) 08:04:14クリティカルなメモリマネージメントをしたければ、その例外ハンドラ用に「小さな」メモリマネージャを持つ。
とか、もっと簡単にコンストラクタで非常用メモリを確保しておいて、new / alloc でエラーが起きたら、
その非常用メモリを解放して最後の後始末をする。とかね。
ディスクも、システム用に「ちょっと」確保しておいて、最後のログはき出しようにそこを使うとか。
実装レベルではそれで十分だし、それ以上の対策なんて、どちらにしろできないだろ?
メモリゼロ、空き容量もゼロであと何ができる?
0903デフォルトの名無しさん
2010/09/28(火) 08:24:07flush到達前に例外でたらスコープ抜ける際にcloseされてそのあとキャッチされて後始末
書き込み一通りエラー無しで通ったのにflush失敗した場合でも例外投げたらスコープ以下同文
0904デフォルトの名無しさん
2010/09/28(火) 08:26:26デストラクタで例外を投げる可能性がある部分を実行するときは
std::uncaught_exception で例外中かどうか確認してからすべきでは
if( !std::uncaught_exception() ) throw 0; トカ
0905デフォルトの名無しさん
2010/09/28(火) 08:27:31デストラクタにしろクローズ処理にしろ、そこまでに処理し忘れていたエラーは全て握り潰すのが基本
エラー拾いたいならそれより前でチェックして例外投げるなり回復処理するなりしなはれ
0906デフォルトの名無しさん
2010/09/28(火) 08:57:29http://www.gotw.ca/gotw/047.htm
> 2. Consider the following code:
>
> T::~T() {
> if( !std::uncaught_exception() ) {
...
> Is this a good technique? Present arguments for and against.
>
> In short: No, ...
0907デフォルトの名無しさん
2010/09/28(火) 09:10:360908デフォルトの名無しさん
2010/09/28(火) 09:18:50if(!r.close())
{
// エラー処理
}
}
なんて書くのはアホのする仕事
void Deleter(resource * pr)
{
if(!r->close())
{
// エラー処理(さっきと同じ)
}
}
{
resource r(..., Deleter());
}
って感じでRAII使って処理するのが仕事で使って良いコード
0xならラムダもあるからコーディングの手間も少ないし、
従来のスタイルと同等の柔軟性もあって、スコープガードとしても機能する
リソースの処理をリソース管理クラスの外に丸出しするなんて愚の骨頂でしょ
0909デフォルトの名無しさん
2010/09/28(火) 10:17:430910デフォルトの名無しさん
2010/09/28(火) 12:07:140911デフォルトの名無しさん
2010/09/28(火) 13:37:330912デフォルトの名無しさん
2010/09/28(火) 13:49:44分からないのなら口を挟まずスルーしろ
0913デフォルトの名無しさん
2010/09/28(火) 14:35:440914デフォルトの名無しさん
2010/09/28(火) 14:49:06発端は>>737,739,742,744。要するに
『解放が必要なリソースを扱うときでも場合によってはRAIIを使わないと言う選択をするべきだ。
なぜならRAIIを使ってリソース解放をデストラクタに一任では解放失敗という事態に対処できないからだ。』
という意見が出る。
で反論。>>770,799とか
『RAII+明示的解放(と解放失敗した場合の処理)、で対処すればいい。RAIIを使うことを否定する意味はない。』
わかってる人にはこの時点で終了。
で、その流れから派生したが本質的でない
・解放処理に失敗したことをどう検知するかという話
・いまだに解放をデストラクタに一任する前提でされている話
・あくまでRAIIを使うべきではないときがあると主張する話
とかをいまだに続けている人がいる。
0915デフォルトの名無しさん
2010/09/28(火) 14:54:260916デフォルトの名無しさん
2010/09/28(火) 15:30:00RAII+明示的解放
は RAII ではない。
ってことでしょ?
0917デフォルトの名無しさん
2010/09/28(火) 15:41:450918デフォルトの名無しさん
2010/09/28(火) 15:47:010919デフォルトの名無しさん
2010/09/28(火) 15:48:270920デフォルトの名無しさん
2010/09/28(火) 15:50:28C++のことはC++0xのことでもあるとおもうが。
0921デフォルトの名無しさん
2010/09/28(火) 16:43:470922デフォルトの名無しさん
2010/09/28(火) 16:46:110923847
2010/09/28(火) 17:27:54> 0xはやれやれだぜってこと?
そう。
学生時代は落とし穴回避する俺sugeeeeモードでそれなりに
楽しくやれたんだが、そろそろ就職と資格勉強にあたり
あんまり時間も取れなくて、それなのに新しい仕様が
登場してきて勉強しなおしかぁ…って気が沈むんだ。
>>849
> 辟易したなら別に勉強しなくていいじゃない
ところがC++が楽しかった思い出が後ろ髪を引くんだよ。
> perlやpythonみたいに古いコードが壊されないのがC++のいい所
Python 2.x では最近習得し始めて、文字列処理するだけなら
圧倒的にこっちがメイン。
最近 3.x で非互換になっているらしいが先進的な機能は使ってない
(というか使えていない)のでまあ問題無い。
>>854
楽しいのか−。
もう学生気分は終わりだからなー。
0924デフォルトの名無しさん
2010/09/28(火) 17:30:310925デフォルトの名無しさん
2010/09/28(火) 17:49:21分からないものは使う必要は無い。
0926デフォルトの名無しさん
2010/09/28(火) 18:34:570927デフォルトの名無しさん
2010/09/28(火) 18:35:350928デフォルトの名無しさん
2010/09/28(火) 18:39:140929デフォルトの名無しさん
2010/09/28(火) 18:46:58最近のIntelCPUなんかアセンブリ命令がさらにこまかい単位になるんだっけか?w
0930デフォルトの名無しさん
2010/09/28(火) 18:56:480931デフォルトの名無しさん
2010/09/28(火) 19:25:250932デフォルトの名無しさん
2010/09/28(火) 19:39:440933デフォルトの名無しさん
2010/09/28(火) 20:48:350934デフォルトの名無しさん
2010/09/28(火) 20:55:180935デフォルトの名無しさん
2010/09/28(火) 21:07:480936デフォルトの名無しさん
2010/09/28(火) 21:24:020937デフォルトの名無しさん
2010/09/28(火) 23:33:57例えば、
Alternative representations(C++03でいうAlternative token)とか、
asm宣言とか、
vector<bool>とか。
0938デフォルトの名無しさん
2010/09/29(水) 00:04:170939デフォルトの名無しさん
2010/09/29(水) 01:00:56vector<bool> は deprecated だし、その役目は dynamic_bitset に移譲
されていくことは確かな訳で
0940デフォルトの名無しさん
2010/09/29(水) 01:04:26標準化委員ってマヌケばっかなのか?
0941デフォルトの名無しさん
2010/09/29(水) 01:08:49まあ間抜けっちゃ間抜け
0942デフォルトの名無しさん
2010/09/29(水) 01:43:51過去の物をどうにかして直せないのかな?
�@過去との互換性を破棄する
�Astd::vector_container<T>というテンプレートを用意して、
Tがboolで無い限りはstd::vector<T>と同じで
Tがboolである場合はコンテナの要件を満たすようにするとか。
(要するにboolでの特殊化をしない)
特に後者�Aの方法で解決できないのかな??
そして今後は�Aを使う様推奨していくってのが良さそうなんだけど。
�Aの方式ってデメリットあるのかな?
教えて標準化委員会の人!!
0943デフォルトの名無しさん
2010/09/29(水) 02:48:580944デフォルトの名無しさん
2010/09/29(水) 03:05:310945デフォルトの名無しさん
2010/09/29(水) 03:07:180946デフォルトの名無しさん
2010/09/29(水) 03:14:42vectorに関しては既にリリースしちゃったから互換性気にする人がいるんだろうな
0947デフォルトの名無しさん
2010/09/29(水) 04:30:42まあこの期に及んでvector<bool>なんて最早全く使わないけどな。
サイズが問題ならbitsetがあるしそうでなければvector<int>で代用すればいい。
0948デフォルトの名無しさん
2010/09/29(水) 07:28:46どっちにせよ面倒そうだから使わないようにしてるけど。
0949デフォルトの名無しさん
2010/09/29(水) 13:12:310950942
2010/09/29(水) 14:57:45何を言っているのかわからんが、
別にboolを特殊化しないだけであとは既存のvectorのコピペでいいんだから
手間は全くかからないとおもうんだけど。
0951デフォルトの名無しさん
2010/09/29(水) 16:01:19丸数字がUnicodeに入った時点で、時代遅れは我々になったのかもしれん
0952デフォルトの名無しさん
2010/09/30(木) 00:53:04まあソフトとフォント?によるけど
0953デフォルトの名無しさん
2010/09/30(木) 01:13:580954デフォルトの名無しさん
2010/09/30(木) 03:13:570955デフォルトの名無しさん
2010/09/30(木) 09:41:42なに?人とは違う、おしゃれな私かっこいい、とか思ってんの?
中身のないマイナーOSは引っ込んでろよ
0956デフォルトの名無しさん
2010/09/30(木) 09:54:120957デフォルトの名無しさん
2010/09/30(木) 11:24:06WindowsもMacも両方対応が不完全
0958デフォルトの名無しさん
2010/09/30(木) 13:53:35反論不能w
0959デフォルトの名無しさん
2010/09/30(木) 14:23:51実際機種の問題じゃなくて掲示板見るときの設定がオカシイってだけでしょ
0960デフォルトの名無しさん
2010/09/30(木) 14:24:59丸付き数字なら、cp932とsjis-macで割り当ててるコードポイントが違うのが原因じゃねーかと思う。
0961デフォルトの名無しさん
2010/09/30(木) 14:33:250962デフォルトの名無しさん
2010/09/30(木) 19:07:36void f(explicit bool);
という構文があればいいのに
0963デフォルトの名無しさん
2010/09/30(木) 19:10:300964デフォルトの名無しさん
2010/09/30(木) 19:35:59なんかそれっぽいの無かったっけ?
自分でMyBoolってクラスを作って、
explicitコンストラクタで bool型だけを受け付けて、
void f(MyBool myb);内に入るとすぐMyBoolが格納しているbool値を放出して
受け取ってもらうってのはらめなの?
0965デフォルトの名無しさん
2010/09/30(木) 19:47:250966デフォルトの名無しさん
2010/09/30(木) 19:56:17ってことは一応可能って事?
自分で描いててこれじゃあんまり有用性無い気がしてきた。
大体
void f(true);
が通らないよねこれだと
0967デフォルトの名無しさん
2010/09/30(木) 21:08:00void f(...){ static_assert(false, "ダメよ♪"); }
0968デフォルトの名無しさん
2010/09/30(木) 21:11:34それって通るコード?
0xって良くわかんない。
0969デフォルトの名無しさん
2010/09/30(木) 21:14:04void f(bool){ ... }
template <class T> void f(T const&){ static_assert(false, "らめぇー"); }
0970デフォルトの名無しさん
2010/09/30(木) 21:22:59その場合、コンパイル時にトラップするだけのための関数を
エラーになるように定義するのも面倒なので
template <class T>
void f(T) = static_assert;
とでも書くと、コンパイラがエラーメッセージを出すようになっていればいいのに
0971デフォルトの名無しさん
2010/09/30(木) 21:25:55これが実体化したらこれこれこうする〜とか
0972デフォルトの名無しさん
2010/09/30(木) 21:29:070973デフォルトの名無しさん
2010/09/30(木) 21:31:25Deletedにすると、boolの例だと逆にトラップ先が無くなって
何でもかんでもboolに集まってくることになる
0974デフォルトの名無しさん
2010/09/30(木) 21:38:03C言語と互換性のある型変換は#include<implicit>みたいなのにすればいいのかな。
0975デフォルトの名無しさん
2010/09/30(木) 21:44:11> C言語と互換性のある型変換は#include<implicit>みたいなのにすればいいのかな。
何を言っているんだ
#includeって何をしていると思っているんだ
#includeじゃなかったとしてもプリプロセッサレベルでどうやって解決しろと。
0976デフォルトの名無しさん
2010/09/30(木) 21:49:40>Deletedにすると、boolの例だと逆にトラップ先が無くなって
>何でもかんでもboolに集まってくることになる
試してみたら、bool以外を弾いてくれてたよ。
hoge.cc: In function ‘int main(int, char**)’:
hoge.cc:3:26: error: deleted function ‘void f(T) [with T = int]’
hoge.cc:6:6: error: used here
hoge.cc
--
void f(bool){}
template<typename T>void f(T) = delete;
int main(int,char**){
f(1);
return 0;
}
0977デフォルトの名無しさん
2010/09/30(木) 21:51:25中にはoperator int(long);みたいなのがたくさん入ってるのを考えてた。
0978972
2010/09/30(木) 21:56:47One can define a template with a deleted definition. Specialization and argument deduction occur as they would with a regular template function.
って書いてあるな
0979デフォルトの名無しさん
2010/09/30(木) 22:08:33= delete; はそういう制限ないんだね。
それに、
8.4.3.2 のノートを見る限り >>976 が正しいみたい。
0980デフォルトの名無しさん
2010/09/30(木) 22:15:59deleted関数でOKってことのようで
0981デフォルトの名無しさん
2010/09/30(木) 22:33:44そうっぽいけど
誰か仕様書に基づき解説してくれ
教えて頭いい人!
0982デフォルトの名無しさん
2010/09/30(木) 22:36:42この4ヶ月でなんか大きな動きあったっけ?
0983デフォルトの名無しさん
2010/09/30(木) 22:38:200984デフォルトの名無しさん
2010/09/30(木) 22:41:490985デフォルトの名無しさん
2010/09/30(木) 23:20:570986デフォルトの名無しさん
2010/09/30(木) 23:30:23n3126 の中を delete で検索すると、「〜できる」みたいな積極的な記述はないけど
言葉のはしばしから窺えることがある(★)。
8.4.3.2
デリートした関数を(暗黙にも明示的にも)参照するプログラムはエラー。
(中略)
関数がオーバーロードされてるときは、オーバーロード解決で選択されたときのみ参照される
★= delete; でオーバーロードできる。
★オーバーロード解決でデリートした関数が選ばれたときにエラー。
14.7.3
以下のものは、頭に template<> を付けて明示的に特殊化できる:
・(削除→デリートされてない←削除)メンバ・非メンバ関数テンプレート
・(後略)
★関数テンプレートも =delete; できる。
★=delete; した関数テンプレートも、明示的特殊化で使えるようにできる。
14.7.12
関数テンプレートを明示的に特殊化するときは、
そのときに inline を付けるか、もしくはデリートしたときのみインラインになる。
元のジェネリックなやつがインラインかどうかは関係ない。
★明示的特殊化で =delete; 可能。
0987986
2010/09/30(木) 23:49:54explicit specializationは「宣言」だから、関数定義はできないのか。
じゃあ
× =delete; した関数テンプレートも、明示的特殊化で使えるようにできる。
× 明示的特殊化で =delete; 可能。
はウソだ。
0988デフォルトの名無しさん
2010/09/30(木) 23:56:14そんなこと、規格のどこにも書いていないじゃないか。
まあ、サンプルコードはメンバー関数の場合しか載っていないというのはあるがな。
0989デフォルトの名無しさん
2010/10/01(金) 00:03:05「deletedな関数は呼び出すべき関数の探索対象にならない」という誤解をしている人はいたが、
「メンバ関数に限る」という誤解をしている人はいないように見える。
0990デフォルトの名無しさん
2010/10/01(金) 00:20:48>じゃあ
>× =delete; した関数テンプレートも、明示的特殊化で使えるようにできる。
>× 明示的特殊化で =delete; 可能。
>はウソだ。
こういう話?
仕様は読んでないが、とりあえずgcc-4.5.1ではコンパイルを通った。
--
// deleteした関数テンプレートを明示的特殊化で使えるように
template<int>void f()=delete;
template<>void f<1>(){}
// 明示的特殊化でdelete
template<int>void g(){}
template<>void g<1>()=delete;
int main(int,char**){
f<1>();
g<0>();
return 0;
}
0991デフォルトの名無しさん
2010/10/01(金) 01:23:300992デフォルトの名無しさん
2010/10/01(金) 01:40:38関数のdeleted定義は、その名前のとおり、関数の定義である。
deleted定義によって定義された名前は、宣言以外の目的で使うことはできない。
使った場合はエラーとなる。
もちろん、関数呼び出しはできないし、未評価式の中でも使えない。
void f() = delete ;
void f() ; // OK、再宣言
int main()
{
f() ; // エラー、関数呼び出し
typedef decltype(f) * type = &f ; // エラー、decltypeの未評価式と、&演算子のオペランド
}
それ以外は、通常の関数の定義とまったく同じように振舞う。
もちろん、name lookupで見つかるし、テンプレートならばインスタンス化されるし、オーバーロード解決の際にも考慮される。
ただし、そうした結果として選ばれた名前が、deleted定義であった場合、その名前を使うとエラーとなる。
0993デフォルトの名無しさん
2010/10/01(金) 01:42:38> なんか皆がどのへんの理解に苦しんでいるのかがわからない。
というかC++0xのカオス状態の規格を読んでも
いまいちぴんと来ないのだ。
単に俺がバカなだけかもしれんけど。
0994デフォルトの名無しさん
2010/10/01(金) 01:46:19decltypeやsizeof中での使用を禁止してるのは何か深い理由があってのことですか?
0995デフォルトの名無しさん
2010/10/01(金) 05:03:46さあ?
しかし、
void f() = delete ;
に対して、
f() ;
がエラーとなるのに、
typedef decltype( f() ) type ;
がエラーとならない、というのは、違和感がある。
0996デフォルトの名無しさん
2010/10/01(金) 07:15:01C++0x 11
ttp://hibari.2ch.net/test/read.cgi/tech/1285884294/
0997デフォルトの名無しさん
2010/10/01(金) 08:14:56template <class T> void f(T){}
template <> void f<>(int){} //A
void f(int){} //B
A,Bの違いが判らなくなって血迷った。
f(1) は B、f<int>(1) は A だとか、そんなことだったっけ。
0998デフォルトの名無しさん
2010/10/01(金) 12:32:550999デフォルトの名無しさん
2010/10/01(金) 12:33:541000小倉優子 ◆YUKOH0W58Q
2010/10/01(金) 12:33:56( ・∀・) 1000ならジュースでも飲むか
( )
し─J
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。