[過去ログ] 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1: デフォルトの名無しさん [sage] 2017/07/18(火) 07:07:27.20 ID:vzMDiUgd(1) AAS
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
外部リンク:codepad.org (コンパイルもできるし出力結果も得られる[]privateをチェック)
外部リンク:ideone.com (時間帯によってはcodepadが重い事があるのでここも利用)
前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
2chスレ:tech
2: デフォルトの名無しさん [sage] 2017/07/18(火) 15:31:46.97 ID:PYVrHLeZ(1) AAS
ほす
3: デフォルトの名無しさん [sage] 2017/07/18(火) 18:40:03.50 ID:R/mOsefM(1) AAS
まさか短時間に20レスしないと落ちる?
4: デフォルトの名無しさん [sage] 2017/07/18(火) 19:38:57.23 ID:u0V8o5mb(1) AAS
そんなことで落ちるならレス数一桁のスレが大量に残ってるわけないだろ
5: デフォルトの名無しさん [] 2017/07/20(木) 23:03:44.79 ID:kpkY/QGw(1) AAS
右辺値参照がネットのどの記事をみてもわからないので書籍に手を出して見ようと思います
右辺値参照についてをわかりやすく取り扱ってる参考書籍があれば教えてください
6: デフォルトの名無しさん [sage] 2017/07/20(木) 23:51:51.38 ID:z9hoJ4wh(1) AAS
ネットで探して出てくるいつもの説明が一番マシではないかという気がしてならない
7(3): デフォルトの名無しさん [] 2017/07/21(金) 00:25:40.36 ID:cbDQlmdo(1/6) AAS
・見分け方
lvalueは、名前がある
rvalueは、名前がない
・rvalueの特徴
名前がないということは使い捨ての一時的なオブジェクトだから、処理が終わったら捨てられる
・使い分けの理由
代入演算子(=)や、関数の戻り値に使う時や、vectorなどのコンテナに放り込む時には、
一旦オブジェクトがコピーされるが、rvalueだと分かっていたら、勝手にmoveしてくれるので処理が速い
特に、でかいデータを持った独自のクラスの場合にコピーよりmoveが速くなる
この機能を使いたかったら、クラスのmoveコンストラクタとmove代入演算子(=)を定義しておくこと
でも、それは面倒だろうから、ある条件を満たしたらコンパイラが勝手に作ってくれる
・条件
独自クラスに次のいずれの定義もしていないこと
a) コピーコンストラクタ
b) コピー代入演算子
c) デストラクタ
C++歴1ヶ月の俺が答えてみるテスト
8(3): デフォルトの名無しさん [] 2017/07/21(金) 00:50:30.03 ID:cbDQlmdo(2/6) AAS
moveコンストラクタを作ったら気づくと思うが、処理内容は結局コピーコンストラクタと同じなわけ
とどのつまり、ポインタをメンバーに持ったクラスを定義する時に有効なんだよ
コピーコンストラクタ(lvalue)だと、コピー元は存在し続ける可能性があるから、
必ず1から全データを作り直して、ポインターのポイント先を新データにしないといけない
でも、rvalueで捨ててもいいデータだと分かっていたら、捨てるデータを捨てずにそのまま使って
ポインタのポイント先をその捨てるデータにすればよいから、楽で速いよねという話
9(4): デフォルトの名無しさん [sage] 2017/07/21(金) 00:56:26.30 ID:joLx1qFD(1/5) AAS
右辺値参照なら
外部リンク:srad.jp
が一番わかりやすい
これ読んでわからなかったらまだ手を出すのが早すぎたと思って諦めたほうが良い
本を買っても無駄な出費になるだろう
そして↑のページを見つけるのに検索してて出てきたのが↓
外部リンク[html]:woorex.com
で、全然読んでないが、こういった文章に価値はないと思う
ネットの文章のすべてに価値があるわけではないと思ったわ
10(1): デフォルトの名無しさん [sage] 2017/07/21(金) 01:02:33.71 ID:joLx1qFD(2/5) AAS
>>8
いや多分そういうことじゃなくて、分からないのはC++の文法的なトリックの部分に関してだと思う
右辺値参照として宣言した変数を参照したら左辺値になるとか
なかなかにクラクラする部分もあるので
11: デフォルトの名無しさん [] 2017/07/21(金) 01:04:55.21 ID:kH4Xa8wr(1) AAS
みなさんありがとうございます
取り敢えず>>7>>8さんのレスを参考に
>>9さんのURLを見て寝ようと思います
迅速な回答ありがとうございました (^○^)
12: デフォルトの名無しさん [] 2017/07/21(金) 01:15:36.94 ID:uK7tgvol(1) AAS
まぁ、あれだよね。
右辺値と右辺値参照の違いを理解できるとスッキリするんだけどね。
13: デフォルトの名無しさん [sage] 2017/07/21(金) 02:26:47.25 ID:9vgFXXAq(1/3) AAS
>右辺値と右辺値参照の違いを
>>9のURL先の説明を書いた低能に100回読ませたい
まずこの違いを明確に理解しないと>>7の様なおかしな説明になってしまう
14: デフォルトの名無しさん [] 2017/07/21(金) 02:39:34.56 ID:cbDQlmdo(3/6) AAS
使う目的が違うの?
15(1): デフォルトの名無しさん [] 2017/07/21(金) 02:47:35.89 ID:cbDQlmdo(4/6) AAS
俺の理解では、moveしたいからそのためにmoveができる条件を定義してるだけだと思うけど
コンパイラーがどういう条件の時に右辺値と扱えるかどうかを示すために
それが、参照に&マークを使っているという歴史的経緯でややこしくなってるだけでしょ
16: デフォルトの名無しさん [sage] 2017/07/21(金) 02:51:29.22 ID:joLx1qFD(3/5) AAS
まずもって
> lvalueは、名前がある
> rvalueは、名前がない
がおかしいということでは?
17: デフォルトの名無しさん [sage] 2017/07/21(金) 07:39:48.91 ID:9vgFXXAq(2/3) AAS
そうだな
「lvalueは、名前がある」という誤った知識を注入されていることもあるが
右辺値(rvalue)についての説明が始まって最後まで右辺値参照の話が無いのは良くないな
18: デフォルトの名無しさん [] 2017/07/21(金) 07:46:07.93 ID:cbDQlmdo(5/6) AAS
レベルの低いスレだな
19(1): デフォルトの名無しさん [] 2017/07/21(金) 07:53:53.57 ID:cbDQlmdo(6/6) AAS
お勧め本の提示ができないばかりか、自分の言葉で説明もできずにただただ罵るだけ
突っ込まれると粗探しをし始める
まぁ、本当に理解してる人間がこんなスレ覗く暇ないわな
20: デフォルトの名無しさん [sage] 2017/07/21(金) 08:31:50.37 ID:9vgFXXAq(3/3) AAS
>>15
>参照に&マークを使っているという歴史的経緯でややこしくなってるだけでしょ
&は昔からあるのに、そうなのだろうか。
どちらかというと右辺値・左辺値が右辺値参照・左辺値参照と直交する概念で、
言葉が似ているのに>>10の例にもあるように「右辺値参照かつ左辺値が同時に成り立つ」ことが原因だと思うのだが
21: デフォルトの名無しさん [sage] 2017/07/21(金) 08:43:30.27 ID:xjFWQMIy(1) AAS
>>19
> お勧め本の提示ができない
>>9の最初のリンクで充分だろ
自分の言葉でとか言うがそこそこ大きな概念だから説明がまともだったとしてもこんなところでとうとうと説明されても困るし>>7-8みたいな中途半端な説明は有害なだけだし
22: デフォルトの名無しさん [sage] 2017/07/21(金) 09:09:12.41 ID:F3uzVYNc(1) AAS
他の言語ではこの概念出てこないの?どこが違うの?
23: デフォルトの名無しさん [sage] 2017/07/21(金) 10:43:02.49 ID:YiUdVm2o(1/4) AAS
他言語では見たことが無いな
参照の仕組みが近いのはC#だと思うが右辺値参照の概念は無い
static int X;
static ref int M() { return ref X; }
static void Main () {
M() = 100;//「M()」実質の左辺値
ref int x = ref M();//「ref M()」実質の左辺値
ref int rx = ref x;
rx++;
Console.Write(M());//「M()」実質の右辺値
}
24(1): デフォルトの名無しさん [sage] 2017/07/21(金) 11:42:16.76 ID:joLx1qFD(4/5) AAS
他言語では代入演算子でオブジェクトをコピーしたり
まるでオブジェクトを基本型であるかのようにふるまわせる概念が無いからな
なぜなら他言語にはGCが有るからね
GCがあって、オブジェクトは常にnewして使うから
勝手にディープコピーされるとか、そういうことは考える必要がないね
逆にC++はGCが無いから・・・
もしC#で右辺値参照があり得るとしたらstructに関してだが
C#のstructはmoveセマンティクスが必要であるような用途に使うものではないから
やっぱり要らないな
25: デフォルトの名無しさん [sage] 2017/07/21(金) 11:52:40.57 ID:XYgV/slE(1) AAS
GCがあるから委譲と複製を区別しなくて済むってのに違和感
上下前次1-新書関写板覧索設栞歴
あと 977 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.023s