次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137
https://mevius.5ch.net/test/read.cgi/tech/1531558382/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
C++相談室 part137
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 12c3-4saf)
2018/08/27(月) 16:02:00.94ID:vY3QDx2y0738デフォルトの名無しさん (オッペケ Sr71-i7GN)
2018/09/25(火) 06:26:38.28ID:cr5GGQ8dr 多次元配列クラス Tensor があるとして、そのインスタンス a は a[2][5][3] のように要素アクセスできるとします。
unique_ptr<Tensor> pa(new Tensor);
のように Tensor のスマートポインタを作った場合、pa の指してる Tensor への要素アクセスってどうやるのでしょうか。
「Tensor」の設計の詳細が必要であれば、boost の multi_array と同じとしていただいて問題ありません。
unique_ptr<Tensor> pa(new Tensor);
のように Tensor のスマートポインタを作った場合、pa の指してる Tensor への要素アクセスってどうやるのでしょうか。
「Tensor」の設計の詳細が必要であれば、boost の multi_array と同じとしていただいて問題ありません。
739デフォルトの名無しさん (ワッチョイ 2d48-coYL)
2018/09/25(火) 07:37:41.21ID:ovBx3cXW0 (*pa)[2][5][3]
740デフォルトの名無しさん (ラクッペ MMe1-BR5k)
2018/09/25(火) 08:18:12.28ID:fJAN4SxzM >>731
自分は業務でC++使ってないのでそういう経験ができないのです‥
だからこそネットで活動してる人しか分からなくて‥
C++は全て独学するしかなくて、いい方法が無いかずっと考えてるのですが、結局ネットや本を見るしかなかったです
自分は業務でC++使ってないのでそういう経験ができないのです‥
だからこそネットで活動してる人しか分からなくて‥
C++は全て独学するしかなくて、いい方法が無いかずっと考えてるのですが、結局ネットや本を見るしかなかったです
741デフォルトの名無しさん (オッペケ Sr71-i7GN)
2018/09/25(火) 12:20:54.85ID:h/rPVSH9r742デフォルトの名無しさん (ワッチョイ c212-yqSl)
2018/09/25(火) 12:31:36.38ID:HAbRzuEs0 >>741
見落とすというか……
予め正解を知っておかないと思い付くのは難しいかもしれない
そしてC++ではなくC言語的な原始的なポインタの話になるので、C++の教科書にそこまで詳しく載ってるかと言うと……
ttp://d.hatena.ne.jp/licheng/20130829/p2
ttp://www.nurs.or.jp/~sug/soft/tora/tora10.htm
ttp://tecmemo.wpblog.jp/2016/09/10/cpp-multidimensional_array/
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03010.html
見落とすというか……
予め正解を知っておかないと思い付くのは難しいかもしれない
そしてC++ではなくC言語的な原始的なポインタの話になるので、C++の教科書にそこまで詳しく載ってるかと言うと……
ttp://d.hatena.ne.jp/licheng/20130829/p2
ttp://www.nurs.or.jp/~sug/soft/tora/tora10.htm
ttp://tecmemo.wpblog.jp/2016/09/10/cpp-multidimensional_array/
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03010.html
743デフォルトの名無しさん (ワッチョイ 01b3-FIjQ)
2018/09/25(火) 13:46:02.72ID:rTSM83rL0744デフォルトの名無しさん (ワッチョイ 01b3-FIjQ)
2018/09/25(火) 13:48:52.76ID:rTSM83rL0 そういえば以前ここで似たようなこと言ったら
「愚者は経験に学び、賢者は歴史に学ぶ」とか言われたなw
ああいうアホになるんだよ、言語の知識だけに閉じこもって何も開発せずにいると
「愚者は経験に学び、賢者は歴史に学ぶ」とか言われたなw
ああいうアホになるんだよ、言語の知識だけに閉じこもって何も開発せずにいると
745デフォルトの名無しさん (ワッチョイ 2d48-coYL)
2018/09/25(火) 20:49:31.31ID:ovBx3cXW0 人は繰り返し、神は再帰する
746デフォルトの名無しさん (ワッチョイ 2260-9U/T)
2018/09/25(火) 21:21:29.13ID:CZcrESgD0747デフォルトの名無しさん (ワッチョイ 2d8a-9DVt)
2018/09/25(火) 21:28:11.49ID:LXnmrKE+0 >>746
ggrks
ggrks
748デフォルトの名無しさん (ワッチョイ 42bd-LgAV)
2018/09/25(火) 22:53:16.70ID:uqsQEMjV0 >>689
>(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
>全体のデザインが定まらない。
無いメソッドを呼べる言語は存在しないからこれは仕方が無い(ジャバに限らん
ジャバに限らずインターフェースには利用者が絶対呼ぶメソッドだけではなく、
呼ぶかもしれないメソッドも全部packing listに入れねばならない点が無駄が大きい
その代わり、インターフェースのメソッドはビルド単位内で一意な名前(インターフェース名)で
(直接的あるいは間接的に)修飾されるから、同じメソッド名で違う機能のやつがあっても
衝突せず、安全性が保たれる
テンプレートはこの点だけがちょっと劣る
これ以外にテンプレートに欠点など無i
>(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
>全体のデザインが定まらない。
無いメソッドを呼べる言語は存在しないからこれは仕方が無い(ジャバに限らん
ジャバに限らずインターフェースには利用者が絶対呼ぶメソッドだけではなく、
呼ぶかもしれないメソッドも全部packing listに入れねばならない点が無駄が大きい
その代わり、インターフェースのメソッドはビルド単位内で一意な名前(インターフェース名)で
(直接的あるいは間接的に)修飾されるから、同じメソッド名で違う機能のやつがあっても
衝突せず、安全性が保たれる
テンプレートはこの点だけがちょっと劣る
これ以外にテンプレートに欠点など無i
749デフォルトの名無しさん (ワッチョイ 82b3-coYL)
2018/09/26(水) 00:16:16.58ID:XAX5fYE80 バイナリインターフェースが重要なシステムもあるわけで
750デフォルトの名無しさん (ラクッペ MMe1-BR5k)
2018/09/26(水) 13:25:47.21ID:3bFkpdGnM C++とシェルスクリプトの違いって何ですか?
シェルスクリプトで出来ることでC++ができないこと
C++が出来てシェルスクリプトで出来ないこととかそういう具体例を教えてほしいです。
シェルスクリプトで出来ることでC++ができないこと
C++が出来てシェルスクリプトで出来ないこととかそういう具体例を教えてほしいです。
751デフォルトの名無しさん (ラクッペ MMe1-BR5k)
2018/09/26(水) 13:28:14.24ID:3bFkpdGnM >>750
個人的に上げるとしたら、webのフロントエンド分野はインタプリタに勝てないと思います
個人的に上げるとしたら、webのフロントエンド分野はインタプリタに勝てないと思います
752デフォルトの名無しさん (ワッチョイ 4234-CvAF)
2018/09/26(水) 13:35:28.26ID:8zK/b6uE0 比較の対象が違い杉
753さまよえる蟻人間 ◆T6xkBnTXz7B0 (スププ Sd62-gRel)
2018/09/26(水) 13:35:54.34ID:NuaJwewid >>750
C++はコンパイルしないと動かない。シェルスクリプトはファイルの操作やバッチ処理が得意。
C++はコンパイルしないと動かない。シェルスクリプトはファイルの操作やバッチ処理が得意。
754デフォルトの名無しさん (ワッチョイ 2d8a-9DVt)
2018/09/26(水) 14:01:36.87ID:3yW6iUgn0 >>750
デバドラをスクリプトで書いてみてくれ
デバドラをスクリプトで書いてみてくれ
755デフォルトの名無しさん (アークセー Sx71-vwf2)
2018/09/26(水) 14:29:30.26ID:lYIfIhjTx >>750
桃白白とラウチェン、マジンガーZとテコンVぐらい違う。
桃白白とラウチェン、マジンガーZとテコンVぐらい違う。
756デフォルトの名無しさん (ワッチョイ 4223-tHrl)
2018/09/26(水) 14:43:50.80ID:zEt8XtGI0 >>750
GUI使ったアプリはシェルスクリプトでは無理
GUI使ったアプリはシェルスクリプトでは無理
757デフォルトの名無しさん (ラクッペ MMe1-BR5k)
2018/09/26(水) 14:51:55.15ID:3bFkpdGnM758デフォルトの名無しさん (JP 0Hd6-Y82R)
2018/09/26(水) 15:12:38.31ID:nKPhFdqbH C++というかオブジェクト指向の質問かもしれないんですけど
エクセルにデータを書き出すためのクラスがありましてメソッドがざっとこんな感じ
・データをファイルから読み込む
・シート作成(ここで以下のメソッドを呼び出す)
・シートAに書き出す
・シートBに書き出す
︙
・シートEに書き出す
全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
ただ正直あまり意味が無いような気もするんですよ。クラスと言うには小さすぎるものになりそうですし。
何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
エクセルにデータを書き出すためのクラスがありましてメソッドがざっとこんな感じ
・データをファイルから読み込む
・シート作成(ここで以下のメソッドを呼び出す)
・シートAに書き出す
・シートBに書き出す
︙
・シートEに書き出す
全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
ただ正直あまり意味が無いような気もするんですよ。クラスと言うには小さすぎるものになりそうですし。
何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
759デフォルトの名無しさん (ワッチョイ 4223-y24S)
2018/09/26(水) 15:23:36.10ID:dRFURWqC0 それは単に
メソッド シート作成(){
シートAに書き出す
シートBに書き出す
︙
シートEに書き出す
}
ということ?それとも
class A {
メソッド シート作成(){
シートAに書き出す
}
class B {
メソッド シート作成(){
シートBに書き出す
}
ということ?
前者ならクラス分ける意味がないと思うが。
メソッド シート作成(){
シートAに書き出す
シートBに書き出す
︙
シートEに書き出す
}
ということ?それとも
class A {
メソッド シート作成(){
シートAに書き出す
}
class B {
メソッド シート作成(){
シートBに書き出す
}
ということ?
前者ならクラス分ける意味がないと思うが。
760デフォルトの名無しさん (ワッチョイ 2d8a-9DVt)
2018/09/26(水) 15:33:15.98ID:3yW6iUgn0 >>756
Tcl/Tk の立場は?
Tcl/Tk の立場は?
761デフォルトの名無しさん (ワッチョイ 5dc3-teld)
2018/09/26(水) 19:56:11.35ID:oECBSnBC0 クラスは行数じゃなくて意味的にまとまってるかどうかだからな
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの
762デフォルトの名無しさん (アウアウウー Sa25-xOzC)
2018/09/26(水) 20:09:57.19ID:LRnZd7JJa >>761
数字が逆じゃないか?
数字が逆じゃないか?
763デフォルトの名無しさん (ワッチョイ cde3-tHrl)
2018/09/26(水) 20:16:07.55ID:ME0063O80 >>758
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ
>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
どのシートに書くかなんて「シートに書く」機能に引数で渡せばいいだけ
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ
>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
どのシートに書くかなんて「シートに書く」機能に引数で渡せばいいだけ
764デフォルトの名無しさん (ワッチョイ 5dc3-teld)
2018/09/26(水) 20:55:21.65ID:oECBSnBC0765デフォルトの名無しさん (ワッチョイ bf9f-e6iu)
2018/09/27(木) 00:26:48.70ID:zZL/tnLy0 さすがに一万行でまとまってるクラスってのはないわ。。
766デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/27(木) 00:28:50.85ID:pq96CSzd0 もしかして知恵遅れは
なんか書くために毎度毎度ofstreamを継承すんの
もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの
さすが
なんか書くために毎度毎度ofstreamを継承すんの
もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの
さすが
767デフォルトの名無しさん (ワッチョイ ff80-LozN)
2018/09/27(木) 00:36:33.47ID:3iNJ0doV0 例えば、基本クラスに出力クラスを作って、
派生クラスに、プリンター・PDF など、機能が異なるならオブジェクト指向だけど、
機能が同じなら、派生クラスではない。
単に、属性・メンバ変数が変わるだけ
派生クラスに、プリンター・PDF など、機能が異なるならオブジェクト指向だけど、
機能が同じなら、派生クラスではない。
単に、属性・メンバ変数が変わるだけ
768デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/27(木) 00:50:27.91ID:pq96CSzd0 void aho::write(ostream& aho) const {
aho << "aho" << endl;
aho << "baka" << endl;
aho << "manuke" << endl;
}
こんな感じで作っとけば
いろんなもんに書ける可能性がある
抽象化をうまく利用するというのは
こういうことだからな
aho << "aho" << endl;
aho << "baka" << endl;
aho << "manuke" << endl;
}
こんな感じで作っとけば
いろんなもんに書ける可能性がある
抽象化をうまく利用するというのは
こういうことだからな
769デフォルトの名無しさん (JP 0H2b-tojA)
2018/09/27(木) 05:39:28.23ID:DR3ASZ+QH 江添亮に匿名で質問ができて、高確率で答えが帰ってくる空間ってもうないのでしょうか
770デフォルトの名無しさん (ワッチョイ bf9f-e6iu)
2018/09/27(木) 07:33:12.06ID:zZL/tnLy0 本人のtwitterにでも投げれば?
高確率で「質問ではない」が帰ってくるが。
高確率で「質問ではない」が帰ってくるが。
771デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/27(木) 07:58:37.31ID:GSDkLsyd0 >>750
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある
もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある
もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…
772デフォルトの名無しさん (ワッチョイ 9fb3-aemA)
2018/09/27(木) 08:51:58.83ID:Ct84HJ0d0 c++はコンパイラいるやろが
773デフォルトの名無しさん (ブーイモ MM5b-d72i)
2018/09/27(木) 09:07:42.86ID:eHS6051wM そんな規約あったっけ?
Cling とか CINT はパチモノ?
Cling とか CINT はパチモノ?
774デフォルトの名無しさん (ワッチョイ 37d2-aemA)
2018/09/27(木) 13:29:28.75ID:lX4OM9LG0 >>768
そういうのは、templateのほうがいい。ostreamに依存せずにすむ。
そういうのは、templateのほうがいい。ostreamに依存せずにすむ。
775デフォルトの名無しさん (ワッチョイ 7748-aemA)
2018/09/27(木) 16:27:38.79ID:Zeo03I1R0 766からの流れでそうなっただけだろ
776デフォルトの名無しさん (ワッチョイ 37e0-OlFv)
2018/09/27(木) 16:47:26.94ID:Oj9x/TA+0 俺には誰一人として標準のstreamクラスを継承する話はしてなかったように思えてならないんだが
(最初の>>758も書き出す処理を継承で共通部分と個別部分に分ける案を問うているだけ)
なんでそういう話になってるんだっけ
(最初の>>758も書き出す処理を継承で共通部分と個別部分に分ける案を問うているだけ)
なんでそういう話になってるんだっけ
777デフォルトの名無しさん (ワッチョイ 9f23-brPT)
2018/09/27(木) 20:48:20.83ID:vb6QqVUs0778デフォルトの名無しさん (ワッチョイ 1704-ClIk)
2018/09/27(木) 20:54:25.22ID:/ZxE29S10 関数にすると不味いことある?
779デフォルトの名無しさん (ワッチョイ 37e0-OlFv)
2018/09/27(木) 21:00:15.42ID:Oj9x/TA+0780デフォルトの名無しさん (ワッチョイ 1704-ClIk)
2018/09/27(木) 21:09:44.86ID:/ZxE29S10 最初にクラスを設計し始めるのは筋が悪いと思ってる。そんな3流プログラマ。
781デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/27(木) 23:22:58.17ID:GSDkLsyd0 訂正;
△:シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
○:シェルスクリプトがあるだけではシェルスクリプトの解釈実行を開始することはできない
シェルスクリプトはもちろんシェルスクリプトから呼ばれるシステムコールその他の
一切合財をシェルスクリプト上だけでシミュレートする能力がある(と思う)が
全ての始まりを起こすのにC/C++で書かれたOSを要する
>>780
つまりクラスの設計はおくらすのが正しい
△:シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
○:シェルスクリプトがあるだけではシェルスクリプトの解釈実行を開始することはできない
シェルスクリプトはもちろんシェルスクリプトから呼ばれるシステムコールその他の
一切合財をシェルスクリプト上だけでシミュレートする能力がある(と思う)が
全ての始まりを起こすのにC/C++で書かれたOSを要する
>>780
つまりクラスの設計はおくらすのが正しい
782デフォルトの名無しさん (ワッチョイ 9f1b-0IEC)
2018/09/27(木) 23:59:38.23ID:RQl7S0Gm0 来たよ、暇なので
783デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 09:32:22.81ID:hWUH9Sli0 最新のC++コンパイラが使えないので質問。
右辺値参照が仮引数になっている以下のような関数があった場合、
aaa(左辺値の変数);
とすると、ちゃんと、aaa() は呼び出される?
それともエラーになる?
void aaa(T&& a)
{
・・・
}
右辺値参照が仮引数になっている以下のような関数があった場合、
aaa(左辺値の変数);
とすると、ちゃんと、aaa() は呼び出される?
それともエラーになる?
void aaa(T&& a)
{
・・・
}
784デフォルトの名無しさん (アウアウカー Saab-NM1n)
2018/09/28(金) 09:39:47.21ID:UtPWkOJga >>1のオンラインコンパイラを使おう
785はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 09:40:07.87ID:7KXXqv1B0786デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 09:48:18.84ID:hWUH9Sli0 >>784
どこにあるの?
どこにあるの?
787デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 09:53:42.38ID:hWUH9Sli0 では、aaa()に次のようなoverloadがある場合は、「2」の方が呼び出されて、
#if の部分を 0 にすると、「1」が呼び出される?
だとすると、昔のC++では無かったような overloadの仕様かも?
T b;
aaa(b); // bは左辺値のつもり
void aaa(T&& a)
{
puts("1, 右辺値参照、T&& に来たよ。");
}
#if 1
void aaa(T& a)
{
puts("2, 左辺値参照、T& に来たよ。");
}
#endif
#if の部分を 0 にすると、「1」が呼び出される?
だとすると、昔のC++では無かったような overloadの仕様かも?
T b;
aaa(b); // bは左辺値のつもり
void aaa(T&& a)
{
puts("1, 右辺値参照、T&& に来たよ。");
}
#if 1
void aaa(T& a)
{
puts("2, 左辺値参照、T& に来たよ。");
}
#endif
788デフォルトの名無しさん (ワッチョイ 9f23-brPT)
2018/09/28(金) 10:13:48.61ID:WRA8TBfa0789デフォルトの名無しさん (ワッチョイ 7748-aemA)
2018/09/28(金) 10:23:34.25ID:RVKB6eOl0 >>783
呼び出されない
右辺値参照は左辺値を受け取らない(原則)
ただしTがテンプレート仮引数の場合と、auto&&の場合は、
右辺値参照で左辺値を受け取れる(特例)
型を推定させた場合に限り、右辺値参照は、
左辺値参照への左辺値参照に変形できる
呼び出されない
右辺値参照は左辺値を受け取らない(原則)
ただしTがテンプレート仮引数の場合と、auto&&の場合は、
右辺値参照で左辺値を受け取れる(特例)
型を推定させた場合に限り、右辺値参照は、
左辺値参照への左辺値参照に変形できる
790デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:32:29.28ID:hWUH9Sli0 [Compile and Execute C++11 Online (GNU GCC v7.1.1)]
https://www.tutorialspoint.com/compile_cpp11_online.php
で下の方のコードを試したら、
$g++ -std=c++11 -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:18:10: error: cannot bind rvalue reference of type ‘TPerson&&’ to lvalue of type ‘TPerson’
aaa(b); // bは左辺値のつもり
^
main.cpp:8:6: note: initializing argument 1 of ‘void aaa(TPerson&&)’
void aaa(TPerson && a)
^~~
というエラーになった。gcc 7.1.1 では、>>785 の言ってくれたことと合ってない???
https://www.tutorialspoint.com/compile_cpp11_online.php
で下の方のコードを試したら、
$g++ -std=c++11 -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:18:10: error: cannot bind rvalue reference of type ‘TPerson&&’ to lvalue of type ‘TPerson’
aaa(b); // bは左辺値のつもり
^
main.cpp:8:6: note: initializing argument 1 of ‘void aaa(TPerson&&)’
void aaa(TPerson && a)
^~~
というエラーになった。gcc 7.1.1 では、>>785 の言ってくれたことと合ってない???
791デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:33:03.33ID:hWUH9Sli0 >>790
[続き]
#include <stdio.h>
struct TPerson {
int m_age;
};
void aaa(TPerson && a)
{
puts("1, 右辺値参照、T&& に来たよ。");
}
int main()
{
printf("Hello, World!\n");
TPerson b;
aaa(b); // bは左辺値のつもり
return 0;
}
[続き]
#include <stdio.h>
struct TPerson {
int m_age;
};
void aaa(TPerson && a)
{
puts("1, 右辺値参照、T&& に来たよ。");
}
int main()
{
printf("Hello, World!\n");
TPerson b;
aaa(b); // bは左辺値のつもり
return 0;
}
792はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 10:35:31.98ID:7KXXqv1B0 あれ? ごめん。
確かめたら呼び出されなかった。
勘違いしてたかも
確かめたら呼び出されなかった。
勘違いしてたかも
793はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 10:39:58.90ID:7KXXqv1B0 あ、逆の場合と混同してた。
const T& に rvalue がマッチするんだった。
このあたりのルール、なんか一貫性がない感じがする。
const T& に rvalue がマッチするんだった。
このあたりのルール、なんか一貫性がない感じがする。
794デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:40:42.82ID:hWUH9Sli0 >>792
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。
https://stackoverflow.com/questions/36206764/understanding-the-code-for-stdmove
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics
The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:
template <class T>
typename remove_reference<T>::type &&move(T &&a)
{
return a;
}
It is now up to client code to overload key functions on whether
their argument is an lvalue or rvalue (e.g. copy constructor and
assignment operator). When the argument is an lvalue,
the argument must be copied from.
When it is an rvalue, it can safely be moved from.
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。
https://stackoverflow.com/questions/36206764/understanding-the-code-for-stdmove
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics
The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:
template <class T>
typename remove_reference<T>::type &&move(T &&a)
{
return a;
}
It is now up to client code to overload key functions on whether
their argument is an lvalue or rvalue (e.g. copy constructor and
assignment operator). When the argument is an lvalue,
the argument must be copied from.
When it is an rvalue, it can safely be moved from.
795デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:44:16.75ID:hWUH9Sli0796デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:49:49.55ID:hWUH9Sli0797はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 11:07:41.28ID:7KXXqv1B0798はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 11:11:50.31ID:7KXXqv1B0 >>789
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
799デフォルトの名無しさん (ワッチョイ 7748-aemA)
2018/09/28(金) 11:58:59.36ID:RVKB6eOl0 >>798
それ以外の何だと思うの?
それ以外の何だと思うの?
800デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 12:26:11.67ID:hWUH9Sli0 >>797
あまのじゃく?
あまのじゃく?
801はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 12:29:12.61ID:7KXXqv1B0 >>799
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
802デフォルトの名無しさん (ラクッペ MM0b-2bq/)
2018/09/28(金) 14:07:40.60ID:7VsD45M6M 江添とお前らどっちがC++に詳しい
803デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 14:45:05.48ID:hWUH9Sli0 >>802
その人もここに来るかも知れないから。
その人もここに来るかも知れないから。
804デフォルトの名無しさん (ササクッテロル Sp4b-cB/m)
2018/09/28(金) 14:53:59.72ID:5bmo24w9p 江添で言えばまさにわかりやすくその辺の事情解説してくれてるだろ
今の話で江添より詳しいとかありえねー
今の話で江添より詳しいとかありえねー
805はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 17:00:34.02ID:7KXXqv1B0806デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 17:18:49.52ID:hWUH9Sli0 >>805
いずれにせよ、気持ちはうれしかったよ。
いずれにせよ、気持ちはうれしかったよ。
807デフォルトの名無しさん (ラクッペ MM0b-2bq/)
2018/09/28(金) 17:49:54.67ID:7VsD45M6M808デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/28(金) 18:34:51.41ID:2UofBC6a0809デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:21:09.15ID:tCflGkAm0 もし非テンプレート関数かつ非インライン関数なvoid bar(Foo&& a)に左辺値xを渡してビルドが通る言語規格だとしたら、
tmp = xのコピー
barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK
一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>789の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>789の例外が設けられた
tmp = xのコピー
barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK
一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>789の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>789の例外が設けられた
810デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:24:43.89ID:tCflGkAm0 訂正;
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる
コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる
コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分
811デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:34:28.86ID:tCflGkAm0 >>793
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
xへのアクセスを機械的にrへのアクセスに置き換えれば良いわけでゼロコスト
rが所有権を失ったらxのアクセスも不正となるが、これは書き換え可能なオブジェクトを
const参照をとってから書き換えた場合も似たようなもの(身からでたサビ
なのでコンパイラはやっぱ何もしなくて良い
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
xへのアクセスを機械的にrへのアクセスに置き換えれば良いわけでゼロコスト
rが所有権を失ったらxのアクセスも不正となるが、これは書き換え可能なオブジェクトを
const参照をとってから書き換えた場合も似たようなもの(身からでたサビ
なのでコンパイラはやっぱ何もしなくて良い
812デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:36:22.95ID:tCflGkAm0 (30分前にこのスレを読んで初めて右辺値とか右辺値参照といったブツを知った初心者なので語ってみた
813デフォルトの名無しさん (ブーイモ MM7b-/SOc)
2018/09/28(金) 22:13:49.14ID:pgnHcfqPM814デフォルトの名無しさん (スップ Sd3f-brPT)
2018/09/28(金) 22:40:22.15ID:5I7m9/jNd どんな文が現れようとずっとrでいいんじゃね?
815デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 22:45:46.54ID:tCflGkAm0816デフォルトの名無しさん (ブーイモ MM7b-/SOc)
2018/09/28(金) 22:50:40.02ID:pgnHcfqPM >>815
ウッサイ、チネ
ウッサイ、チネ
817デフォルトの名無しさん (ワッチョイ ff5b-/SOc)
2018/09/28(金) 23:48:18.05ID:AAs3crMS0818デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/28(金) 23:50:49.06ID:HzE5xAmYr auto a = funcA(funcB(funcC(input)));
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?
つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?
つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?
819デフォルトの名無しさん (ワッチョイ ff5b-/HDE)
2018/09/29(土) 00:09:10.14ID:UwfF5QN40820デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/29(土) 00:13:53.80ID:X+ykKtqpr821デフォルトの名無しさん (アウアウウー Sadb-ZVm4)
2018/09/29(土) 00:22:35.94ID:4+9Po3M4a 単純なコピーよりは早くなる可能性があるってだけでは?
822デフォルトの名無しさん (ワッチョイ ff5b-/HDE)
2018/09/29(土) 00:30:08.48ID:UwfF5QN40 ちょっと誇張しすぎた。
正しくは「コピーもムーブも起らない可能性すらある」
コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ
正しくは「コピーもムーブも起らない可能性すらある」
コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ
823デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/29(土) 00:36:40.21ID:X+ykKtqpr へぇ〜〜〜
ありがとうございます
まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが
ありがとうございます
まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが
824はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/29(土) 02:25:18.76ID:4F2hgYyq0 >>818-823
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。
825デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/29(土) 14:26:47.44ID:7XGFV27+0 >>819
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ
826デフォルトの名無しさん (ブーイモ MM7b-/SOc)
2018/09/29(土) 14:32:22.06ID:OnnXxjQtM827デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/29(土) 14:44:27.90ID:7XGFV27+0 むしろムーブで軽くなるのは大抵の場合ムーブによってヒープの確保、解放を
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが
基本をすっ飛ばすからはちみつその他誤解するやつが出てくる
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが
基本をすっ飛ばすからはちみつその他誤解するやつが出てくる
828デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/29(土) 14:49:31.13ID:IuTgmxg/0 この機能が必要になった背景・経緯
ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。
つまりこんなあぶなっかしい
unique_ptr、shared_ptr、weak_ptrとか使ってるヤツラも
クルクルパーしかいない
この程度の簡単な制御も自分で簡単に制御しきれないワケだからな
ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。
つまりこんなあぶなっかしい
unique_ptr、shared_ptr、weak_ptrとか使ってるヤツラも
クルクルパーしかいない
この程度の簡単な制御も自分で簡単に制御しきれないワケだからな
829デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/29(土) 14:56:25.79ID:IuTgmxg/0 しかしアホのあたらしもの好きは半端ない
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い
830デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/29(土) 14:58:40.21ID:7XGFV27+0 いや、autoはともかくshared, unique, weakは危なっかしくないと思うが・・
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき
831デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/29(土) 14:59:08.11ID:IuTgmxg/0 で、こんなしょうもないことより
ホントに理解しないといけない部分がすっぽりと抜けてる
ホントに理解しないといけない部分がすっぽりと抜けてる
832はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/29(土) 16:42:03.70ID:4F2hgYyq0 C++ の (というかプログラミング言語の) ほとんどの機能は抽象化の道具。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。
>>828
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。
>>828
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。
833デフォルトの名無しさん (ワッチョイ 17b3-kFNE)
2018/09/29(土) 17:03:15.96ID:7XGFV27+0 スマポは言語の機能じゃねーよボケ
834デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/29(土) 18:38:13.57ID:GD2dD6IB0835デフォルトの名無しさん (ワッチョイ d7b3-ZVm4)
2018/09/29(土) 18:45:43.26ID:Dc4laUcM0 ムーブはゼロの発見に次ぐ、人類史上における大発見と言われてるけどな。
ノーベル賞候補の一つにもなってるし。
ノーベル賞候補の一つにもなってるし。
836デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/29(土) 18:51:41.19ID:GD2dD6IB0 std::auto_ptr<T>はもともとオブジェクトをムーブしたくて生まれたわけでは無いと思う…
確実な解放の実現が先
ムーブする仕様はあと
あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある
確実な解放の実現が先
ムーブする仕様はあと
あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある
837デフォルトの名無しさん (ブーイモ MM7b-uZyL)
2018/09/29(土) 18:56:52.23ID:oWn9MzvpM move元のオブジェクトに対するアクセスがコンパイルエラーになるんならわかるけど、そうじゃないんなら
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★9 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【独占スクープ】元TOKIOの松岡昌宏がSTARTO社を“退所”へ「国分のコンプライアンス違反」問題をきっかけに決断、12月から単独で活動 [Ailuropoda melanoleuca★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 ★2 [ぐれ★]
- 高市早苗、約1ヶ月でドル円・10円円安を達成 [256556981]
- (´・ω・`)おはよ
- VIPでアズールレーン
- 【緊急】お前らがサブスク(定期課金)してるコンテンツ教えてくれWWWWWWWWWWWWWWWWWWWWWWWWWWW
- 中国専門家の興梠一郎先生「実は中国が一番焦ってるのが総領事の暴言だ。中国は今かなり追い詰められている」 [904151406]
- するってぇと何かい?2週間前に安全を確認して輸入再開した海産物を食の安全のために輸入停止にしたってのかい?
