C++相談室 part137

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 12c3-4saf)
垢版 |
2018/08/27(月) 16:02:00.94ID:vY3QDx2y0
次スレを立てる時は本文の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
2018/09/24(月) 19:02:18.61ID:63DR0NZS0
>>704
static 宣言する、というのはありな状況ですか?
static MyClass abc;
2018/09/24(月) 19:02:38.38ID:XuY/8j5Q0
こいつ金慶珠みたいなやっちゃな・・・・マジめんどくさい
2018/09/24(月) 19:04:43.22ID:XuY/8j5Q0
>>711>>709

>>708
関数の方を変えなくても、渡すとこで
auto a = hoge(*pMyClass);
でいんじゃね?
それも大変なら>>707みたいにラップするしかないけど
2018/09/24(月) 19:14:36.90ID:yIbiTIWcr
>>710
オブジェクトのサイズが動的に変わるので、難しいです(合ってるかな?)


>>712
> 関数の方を変えなくても、渡すとこで
> auto a = hoge(*pMyClass);
> でいんじゃね?
> それも大変なら>>707みたいにラップするしかないけど

void hoge(MyClass abc);
なる関数 hoge() に、
MyClass* pabc;
pabc = new MyClass;
hoge(*pabc);
とする、ということですよね?
この方法では、関数呼び出し時にコピーコンストラクタが呼ばれますか?
それとも参照渡しのように、実体(?)が渡されるのでしょうか。
2018/09/24(月) 19:30:44.68ID:XuY/8j5Q0
>>713
呼ばれないよ
参照渡しと同じことになる
2018/09/24(月) 19:31:36.39ID:XuY/8j5Q0
あ、もちろん関数側の受け取りを参照のままにしてれば、だけどね
2018/09/24(月) 19:42:51.66ID:E4VB1fuR0
>>708
MyClass abc1;
foo(abc1);

MyClass* abc2 = new MyClass;
foo(*abc2);
delete abc2;
2018/09/24(月) 19:44:00.35ID:E4VB1fuR0
あっ、既に出てたわ
2018/09/24(月) 19:51:26.90ID:yIbiTIWcr
>>714-717
すみません。
>>713は間違っていますね。
hoge() の定義は
void hoge(MyClass& abc);
でした。

ありがとうございます。
提案していただいた方法なら、関数側はほぼ何も変えないでできそうです。
初歩的な質問に付き合っていただき感謝します。
2018/09/24(月) 20:06:20.22ID:I/nCcJf20
https://ideone.com/l7t0qz
上から取れないマウントを取りに行くスタイル。
2018/09/24(月) 20:23:29.03ID:SA5x5JnZ0
ボレロ村上さんや江添さんみたいなプログラマーになりたいんですが、彼等はどうやってC++についてあんなに詳しいのでしょうか?
2018/09/24(月) 20:29:49.13ID:I/nCcJf20
どっちも早いころからパソコンを触っており、
早期にはこんなに言語がなく血反吐吐いて低級言語を覚える必要が少しあり、今はその応用で食ってける。
C/C++も今ほどライブラリがなく、自作するか引っ張ってくるしかなかったうえにそもそもコード系のシャルネットワークがなかった。
2018/09/24(月) 20:40:24.56ID:dKKNaNpJ0
前提として奴らは別にプログラマーとして有名なわけではない。
コードを書く能力と有名なことが反比例しているわけだがそれでもいいなら
彼らの真似事してれば同じようになれるんじゃね?
2018/09/24(月) 20:50:32.86ID:I/nCcJf20
まぁ、名前を聞くようになったのはツイッターあたりからやね。
江添氏はコードのお作法がおかしいと食いついたりしてたし、委員会に近いところにいたのでそういう情報を発していた。
けど、個人ではあまりコードは書いてないみたいだな。
ボレロ氏は高専言いっててそこらへんで色々学んでconstexprライブラリで名前を売ったってところはある。
その後縮小して最近コードを書いているという話は聞いてないような。

どっちも有名になったのはこの世の不満とオタクの人権みたいなのを発していたら有名になったってところはある。と思ってる。
2018/09/24(月) 21:16:51.40ID:GIs1tf8Y0
誰にでもウイークポイントはある
そこを苛める遊びに固執する阿呆は誰からも何も学べないまま
自らがウイークポイントのみからなるコンパクト星として成長するのみ
世の中の誰からも軽蔑しか受けない天涯孤独な存在だ
2018/09/24(月) 21:32:17.37ID:XuY/8j5Q0
まぁ江添氏は委員会の人間だしコードあんま書いてなくても日本のC++ユーザーのために
仕様の解説してくれてるしね
ボレロ氏は・・・まぁその・・・・・生産性あるんだか無いんだかよくわからんライブラリ作ってるというか
あれはあれで勉強になるけど・・・・w

ただ初心者が「ああなりたい」ってよく言ってるのは理解に苦しむな
中途半端な知識でドヤ顔するのでなく、真摯に解説するサイトでも作ってくれりゃ価値があるけど
個人的には彼らを崇拝する人を見るたびに、もやもやした気分になる
言語は道具なんだから使ってなんぼやろ・・・
2018/09/24(月) 21:37:21.19ID:SA5x5JnZ0
>>725
まあ結局言語は道具といっても、作ったものが革新性があったり、真似できないようなら人気を集めるような気がするんだよね
東方のZUNとか別にそこまで凄いゲームでもないけど、プログラマーとしてそこそこ尊敬されてる
2018/09/24(月) 21:59:39.82ID:dKKNaNpJ0
仕事でコード書いてたらc++の最新の仕様を追えないからやらない
とか本気で言ってしまう奴は根本が腐ってると思うよ。
言ってて矛盾を感じないのかと。
2018/09/24(月) 22:02:16.29ID:orHhPIQU0
目標が名声なのか、C++理解度なのか・・・
粛々とコード書き続けるのが一番
2018/09/24(月) 22:40:40.71ID:SA5x5JnZ0
>>728
もちろん理解度なんだけど、何となく日本以外だと彼らしか目標とする人物が見つからなくて
2018/09/24(月) 22:55:21.63ID:CvpxIDb80
ISO/IEC読んでworking draft読んでおまけにg++/clangの実装で読んで
それでみんが知らなそうな重箱をつつくような仕様拾ってきてブログのネタに
すればいいんでないの?知らんけど
2018/09/24(月) 22:59:57.25ID:XuY/8j5Q0
まぁ日本だと、解説サイトで目につく人ってそんなもんか
ZUN氏挙げるのははちょっと不思議だけど・・・
以前東方に使われてる技術の解説がどこかにあったけど、
タスクシステムみたいな古くからある2Dシューティングの常套手段とかしか記憶にない
(なんか驚くようなのもあったかもしれんけど

仕事で書いてると驚くようなコードとか設計をあちこちで見かけるけど、
そういうの書くのはやっぱ誰も知らない無名の職業プログラマだったりするよ
2018/09/24(月) 23:31:07.79ID:nTOSaHPIH
>>731
今もそういう夢いっぱいな話あるの?
昔のファミコンソフトがスーパーテクニックの塊だった、みたいな

最近はリソースが潤沢にあって、手抜きのとりあえず動くプログラムが蔓延しているのだと思ってた
2018/09/24(月) 23:43:30.13ID:CvpxIDb80
今でもゲーム系はスーパーテクニック満載でしょ
マルチコアCPUを90%以上使い倒す世界だからな、すげーわ
2018/09/24(月) 23:47:03.19ID:XuY/8j5Q0
>>732
自分は半端者なんで知識はアレだけど、GTAシリーズとかEAのゲームとか
ああいうのは今でもリソース必死に使い切ってるみたいよ
(Game Programming Gemsとか読んでみたらその片鱗が見える)
スーファミ時代のような変態的なのとは方向性が違ってきてるけど
大規模な開発の上でいかにパフォーマンス損なわずに開発効率を上げるかが重視されてる

もちろん2Dのスマホゲーだったら全然使い切る必要ないだろうけど、そっち方面は詳しくない
(多分言語もC#かSwiftが主流?移植性考えたらC#だろうな
2018/09/25(火) 00:00:26.48ID:C9Mx85q+H
へぇ〜〜〜面白い

「どの業界は超人多い」みたいのあるんだろうか
2018/09/25(火) 00:05:28.27ID:bpDEi/Vx0
個人的にはF-35のソースが読んでみたいw
2018/09/25(火) 06:17:40.32ID:NMIb1H0N0
>>736
さすがにF35のソースは見たことないけど、軍事関係や命に関わるコードはむしろ枯れた技術以外使わないんじゃないかな?
ECUとかはとんでもなく古い考え方(ほぼ全ての変数がグローバル)で作られてるし。
まぁECUの場合それはそれでちゃんと理由があるんだけどね。
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 と同じとしていただいて問題ありません。
2018/09/25(火) 07:37:41.21ID:ovBx3cXW0
(*pa)[2][5][3]
2018/09/25(火) 08:18:12.28ID:fJAN4SxzM
>>731
自分は業務でC++使ってないのでそういう経験ができないのです‥
だからこそネットで活動してる人しか分からなくて‥

C++は全て独学するしかなくて、いい方法が無いかずっと考えてるのですが、結局ネットや本を見るしかなかったです
2018/09/25(火) 12:20:54.85ID:h/rPVSH9r
>>739
すみません……
いろんなところにアスタリスクつけたり矢印つけたりしてみたのですが、そのパターンは見落としてました……
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
2018/09/25(火) 13:46:02.72ID:rTSM83rL0
>>737
組み込み系のノウハウなんだろうけど、大規模な組み込みってなってくると
一体どんな英知が詰まってるのかなーとか気になって
数百万行とかじゃなかったっけ・・
まぁMISRA-C++嫁、で終わる話かもしれんけどw

>>740
自分も会社入る前とか、辞めて休業中は全部独学よ
C++の知識だけに留まらず、何か作りたいもの作ってれば、
その分野での知識が嫌でもついてくると思う
C++の知識だけに閉じこもって実際の開発(プロじゃなくて個人のフリーソフトでも)と
乖離した方向に行ってしまうのが一番怖い
2018/09/25(火) 13:48:52.76ID:rTSM83rL0
そういえば以前ここで似たようなこと言ったら
「愚者は経験に学び、賢者は歴史に学ぶ」とか言われたなw
ああいうアホになるんだよ、言語の知識だけに閉じこもって何も開発せずにいると
2018/09/25(火) 20:49:31.31ID:ovBx3cXW0
人は繰り返し、神は再帰する
2018/09/25(火) 21:21:29.13ID:CZcrESgD0
>>743
>MISRA-C++
そんなものがあるのですか?
2018/09/25(火) 21:28:11.49ID:LXnmrKE+0
>>746
ggrks
2018/09/25(火) 22:53:16.70ID:uqsQEMjV0
>>689
>(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
>全体のデザインが定まらない。
無いメソッドを呼べる言語は存在しないからこれは仕方が無い(ジャバに限らん
ジャバに限らずインターフェースには利用者が絶対呼ぶメソッドだけではなく、
呼ぶかもしれないメソッドも全部packing listに入れねばならない点が無駄が大きい

その代わり、インターフェースのメソッドはビルド単位内で一意な名前(インターフェース名)で
(直接的あるいは間接的に)修飾されるから、同じメソッド名で違う機能のやつがあっても
衝突せず、安全性が保たれる
テンプレートはこの点だけがちょっと劣る
これ以外にテンプレートに欠点など無i
2018/09/26(水) 00:16:16.58ID:XAX5fYE80
バイナリインターフェースが重要なシステムもあるわけで
2018/09/26(水) 13:25:47.21ID:3bFkpdGnM
C++とシェルスクリプトの違いって何ですか?
シェルスクリプトで出来ることでC++ができないこと
C++が出来てシェルスクリプトで出来ないこととかそういう具体例を教えてほしいです。
2018/09/26(水) 13:28:14.24ID:3bFkpdGnM
>>750
個人的に上げるとしたら、webのフロントエンド分野はインタプリタに勝てないと思います
2018/09/26(水) 13:35:28.26ID:8zK/b6uE0
比較の対象が違い杉
2018/09/26(水) 13:35:54.34ID:NuaJwewid
>>750
C++はコンパイルしないと動かない。シェルスクリプトはファイルの操作やバッチ処理が得意。
2018/09/26(水) 14:01:36.87ID:3yW6iUgn0
>>750
デバドラをスクリプトで書いてみてくれ
2018/09/26(水) 14:29:30.26ID:lYIfIhjTx
>>750
桃白白とラウチェン、マジンガーZとテコンVぐらい違う。
2018/09/26(水) 14:43:50.80ID:zEt8XtGI0
>>750
GUI使ったアプリはシェルスクリプトでは無理
2018/09/26(水) 14:51:55.15ID:3bFkpdGnM
>>753
確かにファイルの操作はそうですね
>>754
確かにそういう分野はCですね
>>755
例えが古くてパッとしませんでした‥
>>756
確かにOSにインストールするものはそうですね
2018/09/26(水) 15:12:38.31ID:nKPhFdqbH
C++というかオブジェクト指向の質問かもしれないんですけど
エクセルにデータを書き出すためのクラスがありましてメソッドがざっとこんな感じ

・データをファイルから読み込む
・シート作成(ここで以下のメソッドを呼び出す)
・シートAに書き出す
・シートBに書き出す

・シートEに書き出す

全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
ただ正直あまり意味が無いような気もするんですよ。クラスと言うには小さすぎるものになりそうですし。
何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
2018/09/26(水) 15:23:36.10ID:dRFURWqC0
それは単に

メソッド シート作成(){
シートAに書き出す
シートBに書き出す

シートEに書き出す
}

ということ?それとも

class A {
メソッド シート作成(){
シートAに書き出す
}

class B {
メソッド シート作成(){
シートBに書き出す
}

ということ?
前者ならクラス分ける意味がないと思うが。
2018/09/26(水) 15:33:15.98ID:3yW6iUgn0
>>756
Tcl/Tk の立場は?
2018/09/26(水) 19:56:11.35ID:oECBSnBC0
クラスは行数じゃなくて意味的にまとまってるかどうかだからな
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの
2018/09/26(水) 20:09:57.19ID:LRnZd7JJa
>>761
数字が逆じゃないか?
2018/09/26(水) 20:16:07.55ID:ME0063O80
>>758
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ

>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
どのシートに書くかなんて「シートに書く」機能に引数で渡せばいいだけ
2018/09/26(水) 20:55:21.65ID:oECBSnBC0
>>762
あってるよ
50行でも粗大ゴミは作れちゃうんだよ
2018/09/27(木) 00:26:48.70ID:zZL/tnLy0
さすがに一万行でまとまってるクラスってのはないわ。。
766デフォルトの名無しさん (ワッチョイ 5780-q1nr)
垢版 |
2018/09/27(木) 00:28:50.85ID:pq96CSzd0
もしかして知恵遅れは
なんか書くために毎度毎度ofstreamを継承すんの

もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの

さすが
2018/09/27(木) 00:36:33.47ID:3iNJ0doV0
例えば、基本クラスに出力クラスを作って、
派生クラスに、プリンター・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;
}

こんな感じで作っとけば
いろんなもんに書ける可能性がある

抽象化をうまく利用するというのは
こういうことだからな
2018/09/27(木) 05:39:28.23ID:DR3ASZ+QH
江添亮に匿名で質問ができて、高確率で答えが帰ってくる空間ってもうないのでしょうか
2018/09/27(木) 07:33:12.06ID:zZL/tnLy0
本人のtwitterにでも投げれば?
高確率で「質問ではない」が帰ってくるが。
2018/09/27(木) 07:58:37.31ID:GSDkLsyd0
>>750
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある

もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…
2018/09/27(木) 08:51:58.83ID:Ct84HJ0d0
c++はコンパイラいるやろが
2018/09/27(木) 09:07:42.86ID:eHS6051wM
そんな規約あったっけ?
Cling とか CINT はパチモノ?
774デフォルトの名無しさん (ワッチョイ 37d2-aemA)
垢版 |
2018/09/27(木) 13:29:28.75ID:lX4OM9LG0
>>768
そういうのは、templateのほうがいい。ostreamに依存せずにすむ。
2018/09/27(木) 16:27:38.79ID:Zeo03I1R0
766からの流れでそうなっただけだろ
2018/09/27(木) 16:47:26.94ID:Oj9x/TA+0
俺には誰一人として標準のstreamクラスを継承する話はしてなかったように思えてならないんだが
(最初の>>758も書き出す処理を継承で共通部分と個別部分に分ける案を問うているだけ)
なんでそういう話になってるんだっけ
2018/09/27(木) 20:48:20.83ID:vb6QqVUs0
>>776

>>758
>全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。

書き出す共通部をまとめたクラスというのは
ファイルで言えば ofstream みたいなものなのであろうと皆疑ってるんだろう。
「みたいなものではない」という、結論が違ってくるような違いも提示されないし。
2018/09/27(木) 20:54:25.22ID:/ZxE29S10
関数にすると不味いことある?
2018/09/27(木) 21:00:15.42ID:Oj9x/TA+0
>>777
そうなのか……ありがとう
俺はostreamを引数に取る関数オブジェクトを多態やprotectedを使って実装するみたいなイメージで読んでた
2018/09/27(木) 21:09:44.86ID:/ZxE29S10
最初にクラスを設計し始めるのは筋が悪いと思ってる。そんな3流プログラマ。
2018/09/27(木) 23:22:58.17ID:GSDkLsyd0
訂正;
△:シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
○:シェルスクリプトがあるだけではシェルスクリプトの解釈実行を開始することはできない

シェルスクリプトはもちろんシェルスクリプトから呼ばれるシステムコールその他の
一切合財をシェルスクリプト上だけでシミュレートする能力がある(と思う)が
全ての始まりを起こすのにC/C++で書かれたOSを要する

>>780
つまりクラスの設計はおくらすのが正しい
2018/09/27(木) 23:59:38.23ID:RQl7S0Gm0
来たよ、暇なので
2018/09/28(金) 09:32:22.81ID:hWUH9Sli0
最新のC++コンパイラが使えないので質問。
右辺値参照が仮引数になっている以下のような関数があった場合、

aaa(左辺値の変数);

とすると、ちゃんと、aaa() は呼び出される?
それともエラーになる?

void aaa(T&& a)
{
  ・・・
}
2018/09/28(金) 09:39:47.21ID:UtPWkOJga
>>1のオンラインコンパイラを使おう
2018/09/28(金) 09:40:07.87ID:7KXXqv1B0
>>783
呼び出される。
lvalue は rvalue にもなる。
2018/09/28(金) 09:48:18.84ID:hWUH9Sli0
>>784
どこにあるの?
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
2018/09/28(金) 10:13:48.61ID:WRA8TBfa0
>>787
>>784
2018/09/28(金) 10:23:34.25ID:RVKB6eOl0
>>783
呼び出されない
右辺値参照は左辺値を受け取らない(原則)

ただしTがテンプレート仮引数の場合と、auto&&の場合は、
右辺値参照で左辺値を受け取れる(特例)

型を推定させた場合に限り、右辺値参照は、
左辺値参照への左辺値参照に変形できる
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 の言ってくれたことと合ってない???
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;
}
2018/09/28(金) 10:35:31.98ID:7KXXqv1B0
あれ? ごめん。
確かめたら呼び出されなかった。

勘違いしてたかも
2018/09/28(金) 10:39:58.90ID:7KXXqv1B0
あ、逆の場合と混同してた。
const T& に rvalue がマッチするんだった。

このあたりのルール、なんか一貫性がない感じがする。
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.
2018/09/28(金) 10:44:16.75ID:hWUH9Sli0
>>789
なるほど、std::move() は、あなたの言ってくれた、template の場合に当たるから
こその動作だったんだ・・・。
2018/09/28(金) 10:49:49.55ID:hWUH9Sli0
>>793
template の場合と、auto の場合は、まさに、一貫性が無いということらしい。

こういう一貫性の無さのことを「直交性が低い」と言って、言語が分かりにくい
指標になるらしい。
2018/09/28(金) 11:07:41.28ID:7KXXqv1B0
>>796
一貫性は無いけど、仮引数の rvalue reference に lvalue がマッチ「してほしくない」というのはわかるので、
まあしょうがない。
2018/09/28(金) 11:11:50.31ID:7KXXqv1B0
>>789
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
2018/09/28(金) 11:58:59.36ID:RVKB6eOl0
>>798
それ以外の何だと思うの?
2018/09/28(金) 12:26:11.67ID:hWUH9Sli0
>>797
あまのじゃく?
2018/09/28(金) 12:29:12.61ID:7KXXqv1B0
>>799
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
2018/09/28(金) 14:07:40.60ID:7VsD45M6M
江添とお前らどっちがC++に詳しい
2018/09/28(金) 14:45:05.48ID:hWUH9Sli0
>>802
その人もここに来るかも知れないから。
2018/09/28(金) 14:53:59.72ID:5bmo24w9p
江添で言えばまさにわかりやすくその辺の事情解説してくれてるだろ
今の話で江添より詳しいとかありえねー
2018/09/28(金) 17:00:34.02ID:7KXXqv1B0
>>802
江添氏は C++ を使うプログラマというよりは、
C++ の規格の専門家として C++ の知識を持ってるんだから、
かなり詳しいよ。
2018/09/28(金) 17:18:49.52ID:hWUH9Sli0
>>805
いずれにせよ、気持ちはうれしかったよ。
2018/09/28(金) 17:49:54.67ID:7VsD45M6M
>>804
そのへんの事情って?
>>805
それは本人も自負してるようだけど
2018/09/28(金) 18:34:51.41ID:2UofBC6a0
>>789, >>793あたりの仕様の事情な
2018/09/28(金) 21:21:09.15ID:tCflGkAm0
もし非テンプレート関数かつ非インライン関数なvoid bar(Foo&& a)に左辺値xを渡してビルドが通る言語規格だとしたら、
 tmp = xのコピー
 barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK

一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>789の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>789の例外が設けられた
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況