C++0x 11
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/10/01(金) 07:04:54http://www.open-std.org/jtc1/sc22/wg21/
Wikipedia
http://ja.wikipedia.org/wiki/C%2B%2B0x
前スレ: C++0x 10
http://hibari.2ch.net/test/read.cgi/tech/1275375522/
0153デフォルトの名無しさん
2010/10/12(火) 22:43:03ラムダ式は関数じゃなくて関数オブジェクトだから呼び出し規約はないだろう
0154デフォルトの名無しさん
2010/10/12(火) 22:46:160155デフォルトの名無しさん
2010/10/12(火) 22:46:54MSVCにおける__stdcallとかか?
そんな規格外のことを言われてもな。
規格的にいえば、attributeで実装して欲しいところだが、
規格を守る気のないMSがやるかなぁ?
0156デフォルトの名無しさん
2010/10/12(火) 22:47:46一応、何もキャプチャーしてないと、単なる関数ポインターに変換可能。
0157デフォルトの名無しさん
2010/10/12(火) 22:51:53そしたら、ラムダ式でも何でも渡し放題だ。
ってのをWinSTLとかやっていないかなあ?
0158デフォルトの名無しさん
2010/10/12(火) 23:09:11ラムダめいたことに関してはC言語の独自拡張の方がC++よりもずっと進んでる
0159デフォルトの名無しさん
2010/10/12(火) 23:11:47一生窓やリンゴだけ食って生きてく覚悟があればいいんだろうけど
0160デフォルトの名無しさん
2010/10/12(火) 23:14:070161デフォルトの名無しさん
2010/10/13(水) 01:52:43トランポリンはスタック全部に実行可能属性が付く気持ち悪い仕様
0162デフォルトの名無しさん
2010/10/13(水) 02:13:09まあ、それが出来れば苦労しないんだろうがな。
0163デフォルトの名無しさん
2010/10/13(水) 05:44:06[](int x) [[ __stdcall ]] -> { return x; } みたいに
attribute さんに仕事をあげればいいのに
0164デフォルトの名無しさん
2010/10/14(木) 01:59:520165デフォルトの名無しさん
2010/10/14(木) 03:01:370166デフォルトの名無しさん
2010/10/14(木) 04:20:160167デフォルトの名無しさん
2010/10/14(木) 07:45:34{
public:
const {
void foo();
void bar();
void baz();
};
};
0168デフォルトの名無しさん
2010/10/14(木) 11:36:19{
public:
const {
void {
{ foo, bar, baz }();
}
}
};
0169デフォルトの名無しさん
2010/10/14(木) 18:13:56[[[ __stdcall ]]](int x) { return x; }
0170デフォルトの名無しさん
2010/10/14(木) 20:14:270171デフォルトの名無しさん
2010/10/14(木) 20:49:15便利すぎてやばいな
これ考えたやつは天才だと思う
0172デフォルトの名無しさん
2010/10/14(木) 20:51:01ってOKなの?
0173デフォルトの名無しさん
2010/10/15(金) 07:24:120174デフォルトの名無しさん
2010/10/16(土) 19:29:550175デフォルトの名無しさん
2010/10/16(土) 20:52:23何行も前を確認しないと関数の定義がわからないとか駄目すぎるね。
0176デフォルトの名無しさん
2010/10/16(土) 21:13:150177デフォルトの名無しさん
2010/10/16(土) 21:36:54{
public virtual Hoge const & { foo, bar, baz } (void) const throw() = 0;
};
う、美しい。。。
0178デフォルトの名無しさん
2010/10/16(土) 21:37:500179デフォルトの名無しさん
2010/10/16(土) 21:46:340180デフォルトの名無しさん
2010/10/16(土) 21:47:42たまにやるよ
0181デフォルトの名無しさん
2010/10/16(土) 21:53:000182デフォルトの名無しさん
2010/10/16(土) 22:54:220183デフォルトの名無しさん
2010/10/17(日) 09:03:47のメンバが b,a,c の順にメモリに並んでくれるのかと思ったけど、そうじゃないね。
0184デフォルトの名無しさん
2010/10/17(日) 10:04:52PODにすれば記述順配置になるんじゃなかった?
0185デフォルトの名無しさん
2010/10/17(日) 12:09:51それぞれ記述順に配置される
0186デフォルトの名無しさん
2010/10/17(日) 16:12:35class A { public: char a,b; private: char c,d; protected: char e; public: int f;};
ならaがbの後、cがdの後、それ以外はunspecified(なので親切なコンパイラなら再配置してくれるかもしれない)
例えばf,a,c,b,e,dとかの順でもいい
PODは全メンバのアクセス指定が同じという条件があるので記述順になる
だと思ってたけど規格見るとはっきりしないな
same access controlなら記述順とは書いてるけど(N3126の9.2-13)
"access control"とは何なのかハッキリ定義されてないからどっちにも読める
0187デフォルトの名無しさん
2010/10/17(日) 18:08:48(a,b,f) (c,d) (e) が同じって意味だと思ってたけど
(a,b) と (f) は違うって解釈もできるのね…
0188デフォルトの名無しさん
2010/10/18(月) 22:26:36http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2172.html
9.2 ¶12 Class members [class.mem]
Nonstatic data members of a (non-union) class
<del>declared without an intervening access-specifier</del>
<ins>with the same access control (clause 11)</ins>
are allocated so that later members have higher addresses within a class object.
となっているから、
class A { public: char a; public: int b; public: char c; };
の a, b, c は、このときまでは並べ替えてよかったけど、
今は並べ替えてはいけなくなったようだ。(ついでにPODになった)
0189デフォルトの名無しさん
2010/10/18(月) 22:45:340190デフォルトの名無しさん
2010/10/18(月) 23:48:46それにしても修正入れた割には曖昧な文言だな
0191デフォルトの名無しさん
2010/10/18(月) 23:59:220192デフォルトの名無しさん
2010/10/19(火) 11:10:460193デフォルトの名無しさん
2010/10/19(火) 15:30:280194デフォルトの名無しさん
2010/10/20(水) 04:50:52C99のfenv.hあるいはC++0xのcfenv
のマニュアルはたくさんあるのですが、具体例がなかなか見つかりません。
英語でも書籍でもいいので、ご存知の方いらっしゃいませんか?
try catchと連携させて
double x = 1.0/10;
try {
fetestexcept(FE_ALL_EXCEPT);
x = sqrt(-x);
if (fetestexcept(FE_ALL_EXCEPT)) throw runtime_error("fpe exception!");
} catch (const runtime_error& e) {
cerr << e.what() << endl;
exit(-1);
}
こんな感じで使いたいのですが、いかんせん自己流で自信ないのです。
#define _GNU_SOURCE
は必要ないのか?とか、環境依存性は?とか、色々気になります。
0195デフォルトの名無しさん
2010/10/20(水) 05:04:29なんで _GNU なんてついたマクロが必要かもしれないなんて思うのか、わからない。
「環境依存性は?」と言われても仕様を見たとおり、としか言えない。
何か気に入らないところがあるとか、具体的な不満や要件を挙げてもらわないと、
話にならないね。
「自己流で自信が無い」と言うが、ここで名無しさんが何か言ってくれたら自信が付くわけ
でもないだろう。
0196194
2010/10/20(水) 05:35:57とかを見ると、細かい設定をglibc拡張でやれるって話みたいでした。
色々混乱しててすみません。
C99とか0xの範囲なら環境依存するはずないですよね。
0197デフォルトの名無しさん
2010/10/20(水) 21:57:290198デフォルトの名無しさん
2010/10/20(水) 22:59:210199デフォルトの名無しさん
2010/10/20(水) 23:11:490200デフォルトの名無しさん
2010/10/20(水) 23:32:130201デフォルトの名無しさん
2010/10/21(木) 04:22:420202デフォルトの名無しさん
2010/10/21(木) 12:08:140203デフォルトの名無しさん
2010/10/21(木) 15:12:050204デフォルトの名無しさん
2010/10/21(木) 19:52:220205デフォルトの名無しさん
2010/10/22(金) 08:17:45詳細求む
0206デフォルトの名無しさん
2010/10/23(土) 14:36:01いまさら右辺値さん取り消したら、unique_ptrさんも道連れだよ。
unique_ptrさんマジ便利。いまさらなくせないだろう。
0207デフォルトの名無しさん
2010/10/23(土) 15:57:020208デフォルトの名無しさん
2010/10/23(土) 16:32:370209デフォルトの名無しさん
2010/10/23(土) 17:14:43あたらしい転校生のBOOST_FOREACHさん。,さんが苦手。
0210デフォルトの名無しさん
2010/10/23(土) 19:57:52その次の規格でconceptと一緒に入れてくれよ。
0211デフォルトの名無しさん
2010/10/24(日) 13:50:19使ってみると、意外と便利だぞ。
まあ確かに、今のような糞なイテレート方式じゃなくて、concept使って欲しかったところだが。
0212デフォルトの名無しさん
2010/10/24(日) 13:55:55つーかboostもあるし
0213デフォルトの名無しさん
2010/10/24(日) 14:07:260214デフォルトの名無しさん
2010/10/24(日) 14:11:00std::vector<int>v = { 1, 2, 3 } ;
for ( auto i : v ) { }
0215デフォルトの名無しさん
2010/10/24(日) 14:18:01一見して問題なさそうだけど。
実際、gcc4.6 ではエラーにならない。
0216214
2010/10/24(日) 14:26:36パチもんが実装できないということ。
0217デフォルトの名無しさん
2010/10/24(日) 15:37:59俺はよく使うコンテナクラスにそれぞれ特化したforを定義して使ってるんだけど
0218デフォルトの名無しさん
2010/10/24(日) 15:55:39vector<int> v;
int s=0;
for(vector<int>::iterator i=v.begin();i!=v.end();++i)
s+=*i;
が
vector<int> v;
int s=0;
for(int x:v)
s+=x;
になるんだぜ。これは欲しいな。
あとBOOST_FOREACHで同じよことができるし、autoも使えるし
0219デフォルトの名無しさん
2010/10/24(日) 16:31:44いいな
俺はvから元クラス参照でそこから::iteratorでもいいんだけどね
要するに元の宣言vector<int> をvからひきだしたいだけなんだけど
コードの中にtypdef宣言いれないでmapとかの長い宣言作ると::iteratorの書式が長くて嫌いなんだよね
0220デフォルトの名無しさん
2010/10/24(日) 16:51:47auto使えばいいんじゃね?
0221デフォルトの名無しさん
2010/10/24(日) 19:04:44int s = std::accumulate(v, 0);
0222デフォルトの名無しさん
2010/10/24(日) 19:13:44foreach(auto x:v){}
だな。
BOOST_FOREACH(auto x,v){}
でもOK
>>221
boost::range や Ovenがそれの役目だな。
0223デフォルトの名無しさん
2010/10/24(日) 19:56:570224デフォルトの名無しさん
2010/10/24(日) 20:04:43物覚えが良くないので, 0x の変態構文にはもうついていけんわ
# つか, テンプラの時から思ってたんだが,
# lisp の ` と , を知ると何とか整理してくれやぁ!!! になる
0225デフォルトの名無しさん
2010/10/24(日) 20:09:39コンセプトがあればエラーメッセージがまだ判りやすくなるのにな。
意味不明のエラーメッセージは新規ユーザにとってかなりハードル高いな。
boost conceptcheckでもかなり改善になるから採用されないかな。
0226デフォルトの名無しさん
2010/10/24(日) 20:11:13いえいえ、御代官様の括弧式ほどでは。ふっふっふ
0227デフォルトの名無しさん
2010/10/24(日) 23:33:55xrvalueとかprvalueとかもういいかげんにしてくれる?
みんな、お前ほど賢くないんだから話を複雑にしないでくれ。
ただでさえ、C++は複雑で、経験が少ない社員が含まれる
プロジェクト開発では敬遠されるのに。それでjavaやC#が
流行ったのに。
まったく、学習してないんだな、このタコは。
みなはお前みたいに言語を趣味にしてるんじゃないぞ。
0228デフォルトの名無しさん
2010/10/24(日) 23:42:440229デフォルトの名無しさん
2010/10/24(日) 23:55:02互換性を無視していいなら、同等以上の機能を遥かにシンプルに定義できるっしょ。
xvalueも、規格の文面を全面書き換えするのを避けた結果なんだっけ?
0230デフォルトの名無しさん
2010/10/25(月) 09:59:31いまさらlvalue、rvalueといった用語を廃止するわけには行かない。
この用語は、1950年代から使われていたのだから。
そもそも、値というものには、二つの意味がある
・ユーザーが識別可能であるかどうか
識別可能というのは、具体的な変数名が付いていたり、アドレスが与えられていたりすること。
識別不可能というのは、関数の戻り値などの一時オブジェクト。
・ムーブできるかどうか
この二種類を組み合わせると、
・識別可能でムーブ可能:xvalue
・識別可能でムーブ不可能:lvalue
・識別不可能でムーブ可能:prvalue
・識別不可能でムーブ不可能:該当なし
という四種類の値が出来上がる。
このうち、「識別不可能でムーブ不可能」という値は、C++においては、意味が無い。
そういうわけで、C++における根本的な値は、三種類ある。
その値に名前を割り振ったわけだ。
0231デフォルトの名無しさん
2010/10/25(月) 13:01:11は auto さんがいたら
for(auto i=v.begin();i!=v.end();++i)
と書けるわけで、ことさら range-based for さんを導入する動機が
やっぱりわからん
0232デフォルトの名無しさん
2010/10/25(月) 13:32:010233デフォルトの名無しさん
2010/10/25(月) 13:32:370234デフォルトの名無しさん
2010/10/25(月) 19:10:38例えばxvalue, lvalue, prvalueには具体的にそれぞれどんなものが該当するの?
0235デフォルトの名無しさん
2010/10/25(月) 20:11:01配列だと .begin() とか書けないから
0236デフォルトの名無しさん
2010/10/25(月) 21:10:360237デフォルトの名無しさん
2010/10/25(月) 21:16:54prvalueは今まで通りのrvalue
xvalueは右辺値参照のこと
使う時はこれくらいの理解でおk
0238デフォルトの名無しさん
2010/10/25(月) 21:36:13分かりやすくするという気はないのかね?
0239デフォルトの名無しさん
2010/10/25(月) 21:43:570240デフォルトの名無しさん
2010/10/25(月) 21:57:110241デフォルトの名無しさん
2010/10/25(月) 22:02:000242デフォルトの名無しさん
2010/10/25(月) 22:02:340243デフォルトの名無しさん
2010/10/25(月) 23:34:26処理前のオブジェクトの束縛が、処理後に無くなっても問題ないってことでおk?
0244デフォルトの名無しさん
2010/10/25(月) 23:39:32名前がどうのこうの言う前に概念理解してないだろ。
素直になれ。名前なんて単なる名前だ。酷い命名でもないし。
0245デフォルトの名無しさん
2010/10/26(火) 00:02:22もう必要ないから中身を好きなようにぶち壊してよい物体のこと
0246デフォルトの名無しさん
2010/10/26(火) 00:03:240247デフォルトの名無しさん
2010/10/26(火) 05:42:21lvalueはC++03から何も変わらない。
名前のついている変数やポインターのdereferenceやリファレンスなど。
rvalueリファレンスの変数も、もちろんlvalueとなる。
lvalueは、安全にムーブできない(ユーザーがどのように使うか分からないため)
prvalue(pure rvalue)は、主に一時オブジェクト。
名前がなく、ストレージが確保されている保証もない値。
リファレンス型以外の関数の戻り値とかがこれに該当する。
prvalueは、安全にムーブできる(ユーザーは自由に利用できないため)
xvalue(eXpiring value)は、ユーザーが意図的に作り出すもの。
つまり、lvalueやprvalueを、ユーザーが意図的にxvalueにキャストして、ムーブ可能であることを示す。
static_cast<T &&>(t)や、関数の戻り値の型がrvalueリファレンスの場合、xvalueとなる。
ほかにも、return文でローカル変数をオペランドに渡したときとか、暗黙にムーブが発生することとかがある。
>>244
内部で動的に確保した、何らかのリソースをぶんどってもよいかどうか。
コピー先のオブジェクトが、コピー元を使えない状態にしてもいいかどうか。
std::auto_ptrのようなもの。auto_ptrの場合、コピー後、コピー元は妥当なポインターを持たなくなる。
rvalueリファレンスができたおかげで、auto_ptrはめでたくdeprecatedになったけど。
0248デフォルトの名無しさん
2010/10/26(火) 06:41:16autoって大昔のcのころの機能イメージがあってちょっとコードみててもにょるのが難点
0249デフォルトの名無しさん
2010/10/26(火) 11:14:46>prvalue(pure rvalue)は、主に一時オブジェクト。
>名前がなく、ストレージが確保されている保証もない値。
>リファレンス型以外の関数の戻り値とかがこれに該当する。
>prvalueは、安全にムーブできる(ユーザーは自由に利用できないため)
こめん、上の2行目と4行目の記述が矛盾しているように見える。
「ストレージが確保されている保証もない値」 なら 「安全にムーブ」 でき
ないと思うけど。
「ストレージが確保されている保証もない」 が 「メモリが、名前のある
ポインタ変数によって管理されていない」 という意味ならわからんでも
ないが。
「Move(移動)」とは、右辺値オブジェクト(一時オブジェクト)が(そのデータ
メンバであるポインタを通して)管理している動的メモリを、左辺値オブジ
ェクトが管理している動的メモリとswapすることだと勝手に解釈してたけど、
これって間違い?
両者の動的メモリのアドレスをswapすれば、メモリのコピーも必要ないし、
右辺値オブジェクトはどうせ破壊されるから問題ないと思ってたけど。
0250デフォルトの名無しさん
2010/10/26(火) 11:26:20int z = x + y ;
ここで、x + yという式を評価した場合、その結果を表す一時オブジェクトが生成されるが、
この一時オブジェクトは、具体的なストレージを持たなくてもよい。
ただし、xvalueにされたときは、具体的なストレージが必要となる。
int && rref = x + y ;
ムーブは、言語的にいえば、ムーブコンストラクターかムーブ代入演算子を呼び出すこと。
ライブラリ的にいえば、仮引数の型がrvalueリファレンスな関数も、ムーブしていると言える。
ムーブの具体的な実装は、好きにすればいい。
体一、コピーの具体的な実装も、好きにしていいのだから。
もちろん、デフォルトのコピー、ムーブコンストラクターや代入演算子の定義はあるけどね。
0251デフォルトの名無しさん
2010/10/26(火) 16:40:54それなら、その保証がないのはlvalueだってアドレス参照されない限り
同じなのでは?
0252デフォルトの名無しさん
2010/10/26(火) 18:20:59e.g. 常にアドレス参照可能
■ このスレッドは過去ログ倉庫に格納されています