- 1 名前:デフォルトの名無しさん(ワッチョイ 3b96-ov1m) mailto:sage [2017/07/29(土) 11:28:28.97 ID:o30VDF4g0.net]
- 次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part130 mevius.2ch.net/test/read.cgi/tech/1490917669/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1478440682/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) - VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
- 982 名前:デフォルトの名無しさん mailto:sage [2017/10/08(日) 23:25:19.93 ID:sIfqyVAH0.net]
- 右辺値参照はさっぱり意味わからんわ。
- 983 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 09:00:03.09 ID:U0LcPFS10.net]
- 右辺値参照というのは、関数f()へのT型データの値渡し時に暗黙のうちに行われる(C++03までは無条件に行われていた)
(左辺値) = (右辺値) という代入処理において、 当該代入処理後、右辺値が関数呼び出し元によって使われなくなることが明白なとき、 左辺値へのコピー後、右辺値をデストラクトする という処理に暗黙のうちになっていたものを、 右辺値から左辺値への移動 と「も」書けるようにするためのしくみ Tに効率の良いムーブコンストラクタ(か右辺値参照を引数とする代入演算子)を定義しないとメリットが生じない ポインタに__restrictを付けるべきかどうか悩まねばならないレベルの人用 C++03でもコンストラ・デストラ呼び出し回数削減の最適化がかかって同じような効果になるケースが多々あるから そういうのが信用できない神経質な人向け ※ 個人の感想です
- 984 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 09:09:56.49 ID:Ge9OzZ/lr.net]
- それで>>952の質問の答えはどうなるんだ?
- 985 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 09:20:15.73 ID:U0LcPFS10.net]
- >>957
右辺値参照には一時オブジェクトしか代入できない縛りがあるから_ 関数fooを voiid foo(int&& x) というバージョンしか定義していないとすると、 int g_x = 10; foo(g_x); がビルドが通らないのではないか; 一般的な使用を想定すれば、結局foo(const int& x)も定義必要 C++03までしか使ったこと無いから知らんけど;;
- 986 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 09:37:56.10 ID:nhJ4ZLVgM.net]
- >>958
その場合はfoo(int(g_x));が通るから、必須ではないよ コピーを外側で明示的にやらせることで、こっちのほうが責任が明確になるので好きという人もいる
- 987 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 10:15:14.60 ID:53KUOYPr0.net]
- 必然性の無い実装都合のシンクはクソ
- 988 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 17:26:43.28 ID:bLguG3ky0.net]
- オブジェクトのコピーとかムーブのためにここまで言語仕様を複雑にしないといけないのか。おれにはさっぱり理解不能だわ。
- 989 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 17:57:29.04 ID:0USm99MRM.net]
- 俺も右辺値参照はどうかと思う
いらないよね
- 990 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 18:35:18.07 ID:3udUYydoM.net]
- 使わなくてもいいんじゃないか?
使ったことないから複雑に感じるだけで、そこまで複雑でもないよ
- 991 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 18:45:40.84 ID:UEIAYP2F0.net]
- >>961
GCをもたない言語の宿命だから嫌なら性能を犠牲にするかGCを持つ言語を使えばいい
- 992 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 18:56:48.86 ID:QjIlXwNcM.net]
- いやいやスマポがあるじゃない。
中級が多いプロジェクトならスマポ強制のほうが性能上がるんじゃないかと思う。
- 993 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 18:58:40.39 ID:8DJAJvC20.net]
- 個人的にはC++の言語仕様の暗黒面はほとんど「参照」が絡んでいると思う。
- 994 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 19:50:58.39 ID:3udUYydoM.net]
- ADLとか部分特殊化のマッチとかのほうが、はるかに複雑で暗黒だと思う
- 995 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 20:54:40.71 ID:bLguG3ky0.net]
- >>964
理解してないのでなにを指摘してるかさっぱり分からないが、 つまり、気取ってC++でGCっぽいことしようとして破綻してるわけだな。
- 996 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 20:56:32.03 ID:UEIAYP2F0.net]
- >>968
> 理解してないのでなにを指摘してるかさっぱり分からないが、 わからないなら絡んでくるなよ... > つまり、気取ってC++でGCっぽいことしようとして破綻してるわけだな。 全然違うし
- 997 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 20:56:47.16 ID:1ynB1O3m0.net]
- >>967
そう思う。 そのへんは「ルール」でしかないけど、右辺値参照はそれ自体が左辺値参照とは違うひとつの概念だから理解可能
- 998 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 21:28:57.78 ID:iWLkHfj90.net]
- 右辺値参照なんか、破壊不可オブジェクトをムーブするときくらいしか使わないような。うにーくぽいんたとか。
それ以外は参照でいいし。
- 999 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 21:45:04.70 ID:Rk3/uNWr0.net]
- 右辺値参照の有用性を理解できない人間にとってはそもそもC++自体が無用だと思う
さっさと退散しなさい
- 1000 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 21:56:43.96 ID:bLguG3ky0.net]
- ところでなんでそんなに一時オブジエクトを参照しなきゃいけないコードを書くの?
参照元を管理するのが面倒だから? そういう人は初めからGC言語使えばよくね? ということですか?
- 1001 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:03:17.69 ID:Rk3/uNWr0.net]
- なんでとか言われても。。。
壊してもいい一時オブジェクトの場合、特別に効率的な扱いをしたくなるケースなんて山ほどある それが分からないならC++なんて触らずにGC言語専門でやってればいいと思うよ
- 1002 名前:はちみつ餃子 mailto:sage [2017/10/09(月) 22:10:35.64 ID:GeS0S50a0.net]
- そのあたりはトレードオフなんだよ。
そりゃあ気にせずに済むなら気にしたくないが、気にしなきゃならないときに出来ることがないのはつらいって話で。
- 1003 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:13:59.60 ID:0USm99MRM.net]
- 俺もわからん
左辺値参照ではなく右辺値参照を使った方が 良い状況ってどんなの? あと唐突にガページコレクション出してるけど 何の関係があるの?
- 1004 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:24:17.86 ID:bLguG3ky0.net]
- もしかしてC++で仕事したことないんですか?
- 1005 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:25:07.16 ID:1ynB1O3m0.net]
- そりゃ右辺値を束縛したくてかつconst
- 1006 名前:左辺値じゃダメな場合だろ []
- [ここ壊れてます]
- 1007 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:43:46.89 ID:0USm99MRM.net]
- んー?
結局無いんでしょ? 使うべきシチュが そうならそう言えばいいのに
- 1008 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:45:47.51 ID:jvobj8TT0.net]
- >>979
classの初期化はどう?
- 1009 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:51:16.17 ID:UEIAYP2F0.net]
- 使うシチュエーションがない?
規格決める奴等が無駄にあーだこーだ言ってるだけとか思ってるなら病院に行った方がいいと思う
- 1010 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:54:00.89 ID:0USm99MRM.net]
- 初期化はどう?って言われても・・
右辺値参照で初期化するのがベターな状況は 浮かびませんけど
- 1011 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 22:55:12.55 ID:0USm99MRM.net]
- >>981
と言いつつも 思い浮かばないんでしょ? じゃあ君もワイと一緒ですね
- 1012 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:09:59.39 ID:1ynB1O3m0.net]
- んん?
右辺値を束縛したい(一時オブジェクトだから左辺値としての実体はない) けどconst左辺値じゃダメ(中身を変更したいから) ↑ これのどこにわかりにくい点があるというのか? 「RVOが保証されるようになったらいらない」という意見なら理解できるが・・・
- 1013 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:14:06.35 ID:1ynB1O3m0.net]
- たとえば swap の実装なんか(素朴には)moveを3回繰り返すんだから
右辺値参照の有用性は明らかだろ
- 1014 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:16:20.29 ID:7RyTvmhPr.net]
- >>973「なんでそんなに一時オブジエクトを参照しなきゃいけないコードを書くの?」
↓ >>984「右辺値を束縛したい(一時オブジェクトだから左辺値としての実体はない)けどconst左辺値じゃダメ」 「これのどこにわかりにくい点があるというのか?」 これがアスペというやつか
- 1015 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:20:00.09 ID:1ynB1O3m0.net]
- >>986
は? >>979に言ってるんだよ
- 1016 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:25:56.07 ID:0USm99MRM.net]
- >>985
これを右辺値参照Verに書き換えて 利点を示してもらえますか? void swap(int& a,int& b) { int c = a; a = b; b = c; } void main() { int a = 1; int b = 2; swap(a,b); }
- 1017 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:26:35.20 ID:1ynB1O3m0.net]
- >>986
そっちこそ唐突に>>793と>>984を唐突に矢印で結び付けてるけど大丈夫か? お前の脳内の連想なんて誰にもわからないぞ
- 1018 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:27:28.76 ID:1ynB1O3m0.net]
- >>988
利点はない intだもの
- 1019 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:31:15.79 ID:0USm99MRM.net]
- なら何なら利点があるの?
long long型ならあるの? もう訳が分からないよ
- 1020 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:32:58.04 ID:1ynB1O3m0.net]
- >>991
コピーコストの大きいコンテナだったら三回も代入したくないだろ?
- 1021 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:34:48.01 ID:jvobj8TT0.net]
- >>982
もう使わないなら右辺値参照版のコンストラクタに渡したほうがいいじゃん そしたら、コピーが起きなくて済むでしょ?
- 1022 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:41:18.28 ID:U0LcPFS10.net]
- >>986
右辺値を束縛したい文脈ではかわりにconst左辺値で常におkなのでは…(ていうかconstはあってもなくても良い >>985 T型データのswapは素朴にはT型データのコピー3回+破棄2回ぐらいが生じる のでわ…
- 1023 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:48:51.82 ID:bLguG3ky0.net]
- swapが頻繁に起こるような用途なら、なんではじめからポインタで管理しないんですか?
- 1024 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:49:46.71 ID:qIHa8iWG0.net]
- 一時オブジェクトもglvalueなんだから
T &に束縛できればよかった
- 1025 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:52:41.96 ID:jvobj8TT0.net]
- >>995
ヒープじゃなくてスタックで処理したいから
- 1026 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:55:42.49 ID:0USm99MRM.net]
- 結局のところ
右辺値参照はコピーコストを削減出来るのが利点で それぐらいしか使い道がないってことか かつ、コピーコンストラクタよりムーブコンストラクタの方が コストを軽く出来るクラスに限られると struct a{ void* p; }; // これには効果が期待出来るが struct b{ int p[65536]; }; // これには効果は期待出来ない 結論としては、やっぱいらねーやこんなのってことだな
- 1027 名前:デフォルトの名無しさん mailto:sage [2017/10/09(月) 23:58:36.68 ID:jvobj8TT0.net]
- 後者も効果が期待できるよ
そして、コピーコストが削減できるだけってのは正しいが、いるかいらないかは人による
- 1028 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:01:39.19 ID:O5j+wjNW0.net]
- >>998
> struct b{ int p[65536]; }; // これには効果は期待出来ない それはあんたがそんな構造をよく使うんなら正しい よかったじゃないか、結論が出てw
- 1029 名前:1001 [Over 1000 Thread.net]
- このスレッドは1000を超えました。
新しいスレッドを立ててください。 life time: 72日 12時間 33分 11秒
- 1030 名前:過去ログ ★ [[過去ログ]]
- ■ このスレッドは過去ログ倉庫に格納されています
|

|