C++相談室 part156at TECH
C++相談室 part156 - 暇つぶし2ch1:デフォルトの名無しさん
21/05/19 10:55:13.24 LZZifCH2.net
前スレ
C++相談室 part155
スレリンク(tech板)

2:デフォルトの名無しさん
21/05/19 11:23:50.45 b5zC4CMw.net


3:デフォルトの名無しさん
21/05/19 11:31:17.57 FIiQfBQ7.net
乙でございます

4:デフォルトの名無しさん
21/05/19 11:33:27.40 psqzmlBB.net
乙python

5:デフォルトの名無しさん
21/05/19 11:36:23.16 FIiQfBQ7.net
前スレの>>989
> 可変個の参照の組 (vectorでいい) を関数 hoge に渡したいときって、hoge が vector< reference_wrapper<T> > を取るようにして
> hoge({ref(A), ref(B), ref(C)})
> みたいに呼ぶか、可変引数テンプレートを使って hoge の中でパースするかっていうのが普通のやり方かな?
なんですが、もしかして reference_wrapper って構築時に左辺値を渡したらそれの参照を保持してくれる?
だとしたら
hoge({A, B, C})
と呼べるしかなりスッキリしますね
hoge 内でいちいち get() しないといけないのはダルいですが……

6:デフォルトの名無しさん
21/05/19 12:17:48.45 5AVKLAl8.net
継承や委譲との付き合い方がよく分からなくなった
あるクラスの機能を全部持っていてほしいが is-a 関係がないとかで継承関係にはないように思える場合ってどうすんの
例えば一辺の長さを表す変数やはみ出し判定メソッドを持つ「グリッド座標クラス」があったとして、今「オセロを解くクラス」を作りたいとき
オセロを解くこと is a グリッド座標では全くないし継承するのは頓珍漢に思える
一方で「オセロを解くクラス」がグリッド座標のインスタンスを委譲として持っていたとして、盤の大きさとかはみ出し判定メソッドにわざわざ「グリッド座標クラス」のインスタンスを通してアクセスするのも果たして正しいだろうか
例えば盤面 a と盤面 b を同時に持ったりもするだろうが、a.size() とか b.size() は同じものを表すのでこのようにアクセスするのは可読性を損なう
だから「オセロを解くクラス」は盤面の大きさとかはみ出し判定メソッドを自分のメンバとして持っていてほしいが、継承するべきようにも思えない

7:デフォルトの名無しさん
21/05/19 12:37:51.61 mqAmVEur.net
複数の盤面持つんならメンバで持つ一択だと思うけど
「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
描画の都合とかで外部からアクセスするのが欠かせないなら、インデックス受け取って盤面の参照返すメンバ関数でも用意すればいい

8:デフォルトの名無しさん
21/05/19 12:44:45.80 mqAmVEur.net
あ、あるいは解くクラスが単に外部の盤面を参照する形でもいいかもね

9:デフォルトの名無しさん
21/05/19 12:46:25.42 5AVKLAl8.net
>>7
> 複数の盤面持つんならメンバで持つ一択だと思うけど
「オセロを解く」といった時点で盤の大きさ等決まるんだから、自分のメンバとして基本的な機能持っててほしいと思うんですが、偏った考え方ですかね

> 「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
そう思います

10:デフォルトの名無しさん
21/05/19 12:47:08.07 5AVKLAl8.net
>>8
それはインスタンスとして盤面を持つという意味ではなくですか?

11:デフォルトの名無しさん
21/05/19 12:51:42.12 NOe9g/vN.net
フロント部分とオセロを解くソルバー部分で持ち方変えるってのが普通

12:デフォルトの名無しさん
21/05/19 12:52:13.78 mqAmVEur.net
そう、内包しようとしない方が自然かもしれない
(読んだ範囲で勝手に考えてるだけだけど)
例えばその解くクラスってのがAI的に自動で解くクラスなら、じゃあその対戦相手に同じ(だがインスタンスは別)AIや
プレイヤーが参戦したらどうなるんだ?と考えると
盤面は独立してるほうが自然な気はする(個人の見解です

13:デフォルトの名無しさん
21/05/19 12:54:28.27 A2sERbZl.net
>>6
オセロを解くアルゴリズムとオセロをプレイするモデル次第なのでなんとも。
まあ、オセロを解くんだったら多数のオセロ盤を持つだろうから、グリッドクラスを派生させてオセロ盤クラスを作るだろうな。
人間がオセロをプレイするのを素直にモデル化してもいいけど、ゲーム機のオセロゲームをプレイするようにモデル化したほうが、オセロを解く側のミスや負担が減る。

14:デフォルトの名無しさん
21/05/19 13:23:50.34 5AVKLAl8.net
>>11
フロント部分って今の場合だと「オセロクラス」ってことですか?
つまり「オセロクラス」と「オセロを解くクラス」が、どちらがどちらを含むではなく、やり取りしあって動くべきだということですか?

15:デフォルトの名無しさん
21/05/19 13:26:27.55 5AVKLAl8.net
>>13
派生って継承ってことですか?
つまり必ずしも is-a を満たさなくても機能を全部引き継ぐなら継承は是 (あるいはそうモデル化するのが良い) ということでしょうか

16:デフォルトの名無しさん
21/05/19 14:13:31.63 TD1RuTos.net
かんたんだろ
色々判定してくれるオセロ妖精すなわち神を作ればいい

17:デフォルトの名無しさん
21/05/19 14:28:08.35 mqAmVEur.net
>is-a を満たさなくても機能を全部引き継ぐなら
どちらも自分で書いてるしグリッドクラスも継承を想定して作れるんだからそれでいいとおも
他人の書いた継承を想定してなさそうなのはやめといた方がいいけどね
てかis-a,has-aはあくまで迷ったときの指針に過ぎんし自分で継承が良さそうと感じたならそれで正解だよ

18:デフォルトの名無しさん
21/05/19 14:43:02.57 A2sERbZl.net
>>15
この場合、is-aは「グリッドとして同一視できる」を意味するから、オセロ盤をグリッドとして扱うことができるのなら継承もあり。
ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
オセロ盤とかその他のゲーム盤とかのクラスを(グリッドとして)使うということでもなければ、継承しないほうが設計の自由度を保てる。

19:デフォルトの名無しさん
21/05/19 14:53:47.60 5AVKLAl8.net
>>18
> ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
まさに、そういった意味論的なところで悩んでいます
まあ実際にオセロソルバを作ろうとしているわけではないのですが、同じような局面に何度も出くわして、継承も委譲もどうも適切でないように思えて最終的に「グリッドクラス」の中身をコピペして「オセロソルバクラス」を作るようなこともしばしばしてしまいます

20:デフォルトの名無しさん
21/05/19 15:26:58.77 mqAmVEur.net
そんなん言い出したらメタプログラミングで取り入れるメンバを選択するための継承なんか全部アウトだぞ
STL内部でやってるようなのも全部
ていうか
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが

21:デフォルトの名無しさん
21/05/19 15:43:24.71 LZZifCH2.net
継承でできることを別の手段でもできるって言ってるだけでは説得力がない
そんなん言い出したらC++でできることをCで擬似コード書けるしな
特にコード量が増える「別の手段」を推奨するには
格段に強い理由がないと誰も動かせない

22:デフォルトの名無しさん
21/05/19 16:02:58.49 XxOLfc+T.net
cpprefjp によると std::swap の実装って
void swap(T& a, T& b){
 auto tmp = move(a);
 a = move(b);
 b = move(tmp);
}
みたいな感じですよね?
よくされる「move された後のオブジェクトはどうなってる保証もないのでもう触るべきでない」みたいな説明に照らせば、上のコードは move した後のオブジェクトを再利用してるけど大丈夫なのかなって思ってしまいます
大丈夫なんでしょうか?
また、参照をmoveしたら当然参照元のオブジェクトが「どうなってる保証もない」と考えるべきなんでしょうか?

23:デフォルトの名無しさん
21/05/19 16:39:28.28 XxOLfc+T.net
もう一個質問させてください
引数に参照をとる関数に一時オブジェクトを渡したいこともあるんですが、この場合は const参照か右辺値をとる関数としてオーバーロードするしかないですよね?

24:デフォルトの名無しさん
21/05/19 16:43:38.10 TD1RuTos.net
>MoveConstructibleかつMoveAssignable
こうなってるからヨシ!

25:デフォルトの名無しさん
21/05/19 19:24:14.37 8oBHesVz.net
>>22
move後の変数は、読み取った場合の値はどうなってるか保証できないが、
値を書き込むことは正常に出来る事が保証されていると聞いた。
破棄することや、初期化することも問題ない。

26:
21/05/19 19:54:41.64 Y2/6iGxL.net
>>1
お疲れ様です

27:デフォルトの名無しさん
21/05/19 20:51:32.06 aTtniYy+.net
>>25
moveコンストラクタは呼ばれないの?
呼ばれるのなら保証するのは自分自身なのでは?

28:デフォルトの名無しさん
21/05/20 02:43:42.49 UJvm/t/I.net
>>27
moveコンストラクタは、変数定義を
TYPE x = y;
の形式で書いた場合に y が右辺値の場合に呼び出されるだけ。
move代入は、
x = y;
の形式で書いた場合に y が右辺値の場合に呼び出されるだけ。
後者の場合、xがmove後であるかどうかは関係ない。
変数xの中身をmove後のxへの書き込み、xの破棄、x.init()などとしての
再初期化が「保証される」というのは、保証されるようにSTLライブラリなどが
作られているという意味で、コンパイラが保証するというわけではない。

29:デフォルトの名無しさん
21/05/21 05:29:55.67 J+Oc/LGb.net
T が値なら終了して、vector<T> なら再帰的に自分を呼ぶ関数を作りたいのですが、T が vector (あるいはコンテナ) かどうかで分岐する処理ってどうやって書くのが良いですか

あと近い話題で、+ 演算子をオーバーロードして vector + vector が結合された vector を返すようにするのってナシですかね?(string のように)
要素同士の和をとるのと紛らわしいですか?
cat(vector, vector) とかの方が良いかな

30:デフォルトの名無しさん
21/05/21 06:16:08.57 682YZm8K.net
固定長文字列クラスってないんですかね
template<int N> void hoge(string s){
 ……
 assert(N == s.size());
 array<int, N> a;
 ……
}
なる関数を呼び出すときにテンプレートパラメータを省略したいんです
s が固定長なら s から N を推論してくれますよね

31:デフォルトの名無しさん
21/05/21 06:29:04.74 682YZm8K.net
あるいは hoge の引数を costexpr に限る方法なんかがあれば、N は必ずコンパイル時に推論できるようになるの思うので、もしそういうものがあればそれでも大丈夫です

32:デフォルトの名無しさん
21/05/21 11:15:57.88 pMLUvwAV.net
もしかして、C++11に対応したSTLで、BSD/MIT 系ライセンスのものは存在してませんか?
・apache-stlは、2008年くらいで開発が終了しているようです。
・msvc用のstlはapacheライセンスですが、vcruntime.hが存在しないと
 エラーになるようです。

33:デフォルトの名無しさん
21/05/21 12:27:55.17 anlX8gXg.net
apacheで良ければllvm

34:デフォルトの名無しさん
21/05/21 15:55:15.71 FMNTAZuF.net
>>30-31
これマジキボンヌなので何卒よろしくお願いします

35:デフォルトの名無しさん
21/05/21 16:07:34.25 wQUXYA+s.net
>>30
よくわからんが何で長さの相違を型の相違にしたいんだ?
文字列リテラルならこういう手があるけど
template <int N> void hoge(const char(&s)[N])
{
}

36:デフォルトの名無しさん
21/05/21 16:09:26.25 zwURlIka.net
>>34
整数のテンプレート引数を使って、std::stringを継承した文字列クラステンプレートを作ればなんとかなりそう。試してないけど。
std::stringの継承はけっこうクセがあった気がするから、自分で調べてね。

37:デフォルトの名無しさん
21/05/21 16:18:16.28 cnTkitrU.net
>>30
>テンプレートパラメータを省略したいんです
の理由がただお遊びレベルのような気がしてスルーしてたけど
固定長の文字列クラスは標準には無い、欲しけりゃ探すか自分で作れ、それか>>35

38:はちみつ餃子
21/05/21 16:51:46.16 JT5uzYpW.net
コンパイル時プログラミングのための機能を満載したライブラリ Sprout がある。
constexpr 対応した文字列クラスもある。
URLリンク(boleros.hateblo.jp)
ボレロ村上が亡くなってもう一年以上たったんだなぁ……。
Sprout のメンテナンスを引き継ぐ大きな組織とかないのかね?
いっそ Boost に編入するとかでもよいような気がするが。

39:デフォルトの名無しさん
21/05/22 04:55:57.93 Dt9VIAZx.net
>>35
> 何で長さの相違を型の相違にしたいんだ?
すみません。どういう意味でしょうか
やりたいことは、関数に渡した定文字列の長さをコンパイル時定数として扱うことです

> 文字列リテラルならこういう手があるけど
ありがとうございます
これが現在やりたいことに最も近いです
2つの文字列リテラルの共通部分列の長さをコンパイル時定数として扱うみたいなこともできそうで、ワクワクしています

>>36-37
ありがとうございます
自作は想像だにしない失敗に繋がりそうなのでやめておきます

固定長文字列とか引数を constexpr に限るとかすごい便利な機能に思えるんですが、今後標準に入ることはあるんでしょうか
それとも僕の不理解で便利に見えるだけなんでしょうか

40:デフォルトの名無しさん
21/05/22 10:24:05.95 zUe7A7la.net
固定長文字列ってCOBOL以外にあるの?
FORTRANにも無いしCにも無い
現行言語には存在すらしない
昔から特殊技術で需要が少ない

41:デフォルトの名無しさん
21/05/22 10:31:31.29 tdkMyXe1.net
malloc使わなかったらcも固定長でしょ
あとsql

42:デフォルトの名無しさん
21/05/22 12:24:13.54 oerUOwsX.net
>>39
文字列長ごとにメソッドが別になってプログラムサイズの肥大化に繋がる。
スタックに文字列を全部乗っけて(若干の)スピードアップを狙うこともあるけど、そのときでも「〇〇文字以下」みたいにサイズ制限するくらい。Delphiの文字列がそうだったと思う。

43:デフォルトの名無しさん
21/05/22 14:32:38.17 uYvLH1Gz.net
>>40
FORTRANにもあるしPascalにもあるぞ
需要じゃなくてお前の知識が少ないだけだろw

44:デフォルトの名無しさん
21/05/22 16:10:33.68 F6wYMINE.net
clangで、#includeや#include_nextした全てのインクルードファイルの
パスの一覧をテキストファイルに出力することは出来ますか?

45:はちみつ餃子
21/05/22 18:00:59.52 +NInCFK+.net
>>44
-MD オプションかな。 これは gcc と clang で共通。

46:デフォルトの名無しさん
21/05/23 06:05:08.87 NALp7ema.net
すみません
>>5の方法で可変個の参照の組を関数に渡そうとして行き詰まりました
hoge の定義を
template<class T> void hoge(vector< reference_wrapper<T> >);
として、hoge({a, b, c}) と呼んだら T が推論できないとエラーが出ました

47:デフォルトの名無しさん
21/05/23 07:05:25.07 apxwsDfF.net
a, b, c がfoo_t型だとして
単に型foo_tを明示して hoge<foo_t>({ a, b, c}) と呼んだら良いんジャネーノ;;;

48:デフォルトの名無しさん
21/05/23 07:07:18.56 apxwsDfF.net
質問ですがvirtualでないクラスFoo(つまりdynamic_cast適用不能)のオブジェクトをthrowしたら
catchできます?

49:デフォルトの名無しさん
21/05/23 07:30:24.57 NALp7ema.net
>>47
ありがとうございます
ただ、なぜに推論できないのでしょうか
template<class T> void hoge(vector< reference_wrapper<T> >);

template<class T> void hoge(vector<T>);
が両方あってどっちか判断できないって話なら分かるんですが

50:デフォルトの名無しさん
21/05/23 07:33:59.12 8ydzk+Rl.net
reference_wrapper<T> をテンプレート型として認識できないからでしょ

51:デフォルトの名無しさん
21/05/23 07:51:37.19 NALp7ema.net
>>50
ありがとうございます
コンテナの入れ子の中に T があっても推論してくれる例を知っていたので、いつでもできるのだと誤解していました

52:デフォルトの名無しさん
21/05/23 08:00:14.50 apxwsDfF.net
{ 1, 2, 3 }というだけではstd::vector<int>なのかstd::vector<double>なのか(ひょっとしたらstd::vector<long>とかかも??)
わからないからという理由
自動型変換結果とのマッチングは追求しだすときりが無いので規格でどの範囲でやるか制限がかかっているたはず

53:デフォルトの名無しさん
21/05/23 08:08:22.67 p04S1woO.net
>>48
C++はintだって投げられるし捕まえられるぞ

54:デフォルトの名無しさん
21/05/23 08:15:35.83 apxwsDfF.net
>>53
投げたブツの型の情報がどうやってcatchする場所に伝わっているのかキボン

55:デフォルトの名無しさん
21/05/23 08:18:02.28 W+jRvSTD.net
以心伝心

56:デフォルトの名無しさん
21/05/23 08:30:19.77 GrP2Tvrl.net
Emacs で LSP 使わず開発してる人いる?
おもしろ設定とか参考になるサイトあったら教えてほしい
flycheck しか入れてない

57:デフォルトの名無しさん
21/05/23 09:14:09.25 p04S1woO.net
>>54
関数呼び出しと一緒やぞ
catch節に書いた仮引数でオーバーロードしてると思えばいい

58:デフォルトの名無しさん
21/05/23 09:31:01.96 apxwsDfF.net
>>57
ありえん
1つのthrowに対し、呼び出し元のcatchで呼び出すべき(オーバーロードされた)関数シンボルを一意に列挙できるなら
アンワインド時にオーバーロードのしくみで例外ハンドラの解決を行えるかもしれないが、これは論理的に成り立たない
なぜなら、例えばintを例外をスローする関数foo()がbar()とbaz()から呼ばれているとして、
bar()にcatch (int)が書かれているのにbaz()に描かれていないとした場合、
bar()経由の呼び出しにおいては(オーバーロードされた)関数シンボルのリストに func(int)が含まれるのに対し、
baz()経由の呼び出しにおいては(オーバーロードされた)関数シンボルのリストに func(int)が含まれない、
となって一意にならず、throwした瞬間にどっちなのか解決不能
やっぱcatch側が(何が来るかわからない状態で)待ち受けているとしか考えられない

59:デフォルトの名無しさん
21/05/23 09:40:45.57 apxwsDfF.net
ちょっち補足すると、
bar()でtry { foo(); } catch (int ex) { .... } したときに handler(int)を例外ハンドラのリストに動的に登録し、
baz()ではtry { foo(); } catch (int ex) { .... } が無いからhandler(int)を例外ハンドラのリストに動的に登録しないようにすれば、
foo()でthrowしたときに最新の例外ハンドラのリストを参照することによって解決はギリ可能だが、
スタックとは別に例外ハンドラのリストに動的に管理するみたいなことをしているのかとカナーリ疑問に、
(例外がfall throughする関数の中にはゼロコストの奴も含まれるので、スタック上で細工して例外ハンドラのリストを更新管理することは不可能

60:デフォルトの名無しさん
21/05/23 09:42:11.13 vhcqGTpc.net
>>54
exception_ptr

61:デフォルトの名無しさん
21/05/23 09:52:50.26 apxwsDfF.net
exception_ptrの主な用途は、バックグランドスレッドからメインスレッドに、例外オブジェクトを持ち運ぶ、というものである。標準ライブラリにおいては、promiseとfutureの実装で使用される。
と書いてあってスレッド間をまたぐ用(promiseしたことを実行中に起きた例外を、promise完了を待っているやつに伝える)とき限定に見える
単純にcalleeからcaller側に飛ばす通常の例外ではどうなのや??
intやdoubleやconst char*を型情報とともに収容可能なexception_ptrみたいな構造体が絡んでいるのだろうとは思いまするが

62:デフォルトの名無しさん
21/05/23 09:54:00.48 apxwsDfF.net
イマイチ確証が無い

63:デフォルトの名無しさん
21/05/23 10:08:43.53 vhcqGTpc.net
>>61
スレッドは関係ないぞ
同一スレッドでも監視ブロックを抜けrた後でrethrow_exceptionできるし

64:デフォルトの名無しさん
21/05/23 10:30:51.86 apxwsDfF.net
>>63
言わんとすることはわかりまするが
(そもそもpromise/futureのしくみも論理的には単なる継続なので単一スレッドでの実装もあり得るという意味でスレッドは関係無い
しかしrethrow_exception(ex)はrethrow_exception(ex)であってthrow exとは別の文やん??
本当に単純にcalleeからcaller側に飛ばす通常の例外も同じしくみなのかどうか、、、

65:デフォルトの名無しさん
21/05/23 10:45:18.88 apxwsDfF.net
スマン>>58>>59は撤回
やっぱ関数のオーバーロードで呼び出すべきハンドラを解決している可能性がありえまつね
というのはスタックにはreturn addressが積まれているので、throw intするfoo()は、
throwする瞬間に自分がbar()経由で呼ばれたのかbaz()経由なのか判定可能
あとはreturn addressに対して呼び出すべきハンドラ(のシンボルのリスト)を与えるテーブルがあれば、
関数のオーバーロードで呼び出すべきハンドラを解決できる
極力実行コストを低くする手となるとこれかなあ……
長々とスマンカッタ、継続調査しまつ

66:デフォルトの名無しさん
21/05/23 12:13:22.18 MJ9lD3tL.net
>>56
>Emacs で LSP 使わず開発
その発想がナンセンス

67:デフォルトの名無しさん
21/05/23 13:43:41.87 p+CWzw6b.net
>>66
lsp-mode インストールしてファイル開いてみたら「これはなんのプロジェクトにも属してないファイルだ」とか言って何もしてくれなかったもん
テキストエディタだぞ
単一ファイルのソースも普通に編集できるべきだ

68:デフォルトの名無しさん
21/05/23 13:53:03.07 P4UGjjTl.net
インストールさせるという選択肢である以上は
emacs側はそれをやるかどうかの選択をユーザに委ねていることになる
なのでNoという選択もありうる、とemacs側は考えている
選択肢が無く強制なら選択をさせずインストール現象もまた起こらない
インストールさせるということはYesかNoかをユーザが選ぶことができる仕組みになっているからだ
YesでもNoでもなく選択出来ないならインストールさせない仕組みになっているハズだ
ここでインストールできるということはユーザのYes/Noの意思が尊重されることに他ならない
選ぶ・選ばない・強制、などにおいて、選ぶことが出来る事象については何を選択してもいいし、emacs側もそれを容認している

69:デフォルトの名無しさん
21/05/23 14:03:17.45 JOTdPSSV.net
>>45
有難う。

70:デフォルトの名無しさん
21/05/23 14:27:22.85 vhcqGTpc.net
>>64
よくわからんが、こういうこと?
void caller()
{
exception_ptr ex;
ex = callee();
try
{
rethrow_exception(ex);
}
catch(double err)
{
cout << "What the hell does that mean?\n";
}
}
exception_ptr callee()
{
try
{
throw 0.1;
}
catch(...)
{
return current_exception();
}
}

71:デフォルトの名無しさん
21/05/26 14:25:57.68 h0MuFhR9.net
クラスAがクラスBのインスタンスをメンバに持つとき (移譲っていうんだっけ?)、Bのコンストラクタってどーやって呼ぶんよ

72:はちみつ餃子
21/05/26 15:13:47.43 BWKw9sIj.net
>>71
メンバ初期化子リスト
URLリンク(ja.cppreference.com)

73:はちみつ餃子
21/05/26 16:01:46.87 BWKw9sIj.net
C++20 からは std::string は constexpr 対応になっとるな。
実装が追いついとるかどうか知らんけど。

74:デフォルトの名無しさん
21/05/26 17:48:11.97 ArjioGpg.net
vectorもconstexpr

75:デフォルトの名無しさん
21/05/27 04:38:09.87 wOxUHlR5.net
constexpr引数ってコンセプトとか使っても無理なん

76:デフォルトの名無しさん
21/05/27 10:11:42.93 KxmxhHMB.net
なぁ…何気に…普通に…何の気なしに…以下の様なコードを書く…
textView1->get_source_buffer()->place_cursor(
textView1->get_source_buffer()->get_iter_at_line(minusList.f


77:ront() - 1)); なんだけどさ…このplace_cursorの引数はiteratorなんだが…この一時的に作った無名の変数の寿命って… どうなってるの?…ちなみに…place_cursorは&で受ける…やばいのかな?



78:デフォルトの名無しさん
21/05/27 10:35:07.24 KxmxhHMB.net
place_cursorを実行している段階では…生きている…そうだ…次のステップに移行すると…消える…らしい
ほんまかいなと思いますが…一応…信じておきます…

79:デフォルトの名無しさん
21/05/27 11:20:16.69 tgaRcrWk.net
またお前か

80:はちみつ餃子
21/05/27 13:24:29.13 tXzwBfxM.net
>>76
一時的なオブジェクトの寿命が完全式の終わりであることは保証されている。
URLリンク(timsong-cpp.github.io)
参照が一時オブジェクトに束縛されているときは更に寿命が延長されることもある。

81:デフォルトの名無しさん
21/05/27 14:31:37.41 U0nLnJgd.net
勝手に消えるのは確かだが
いつ消えるかは確定出来ないんじゃないの?
次の行の実行中かも知れないし
もう少し生きてるかも知れない
関数抜けたら消えるだろうけど

82:デフォルトの名無しさん
21/05/27 14:35:50.64 P6misAvy.net
その、意味があるとかないとかを、どうやって判断するかと聞いてるんじゃないかね

83:デフォルトの名無しさん
21/05/27 14:57:58.21 THQ6jHMK.net
記述時に事細かに寿命を制御・確定できるような時制プログラミングを作ればいい
C++の場合だと新しい原理を作ればいい

84:デフォルトの名無しさん
21/05/27 15:03:35.45 kQVwJQto.net
> 参照が一時オブジェクトに束縛されている
一時オブジェクトが参照に束縛されている、だろ
ここではconstでない左辺値参照は含まない

85:はちみつ餃子
21/05/27 15:10:56.23 tXzwBfxM.net
>>83
> 一時オブジェクトが参照に束縛されている、だろ
いいえ。 束縛されるのは参照で束縛するのはオブジェクトです。

86:デフォルトの名無しさん
21/05/27 15:24:54.29 kQVwJQto.net
>>84
規格票での言葉遣いはこうなっているぞ
CA &&r = A{}; // OK, reference binds to temporary array object

87:はちみつ餃子
21/05/27 15:27:03.62 tXzwBfxM.net
>>85
実際はそこらへんいいかげんなんですよ。

88:デフォルトの名無しさん
21/05/27 15:30:34.22 kQVwJQto.net
いや、おかしいだろ
rand(); //ここで消えてしまう一時オブジェクトを
auto&& a = rand(); //引き止める(束縛する主体が参照で
客体が一時オブジェクトだぞ

89:デフォルトの名無しさん
21/05/27 15:31:06.17 kQVwJQto.net
typo
(束縛する)

90:はちみつ餃子
21/05/27 15:46:15.37 tXzwBfxM.net
>>85
このへんのセクション内部ではどちらの表現もある。
URLリンク(timsong-cpp.github.io)
"自由変数と束縛変数"
URLリンク(ja.wikipedia.org)
このへんの数学的用語では束縛されているのは変数で、 ML 系とか Scheme とかでも一貫してこの用法に従ってるんだけど、
めんどいから私は「××との間に束縛を持つ」みたいな言い回しでどちらが主語なのか曖昧にしたりしてる。
今回の場合は >>79 で示した通りオブジェクトの寿命に関する項目での表現では束縛されているのは参照だから
それにならっただけでどっちがどっちでもまあ重要じゃないよ。

91:デフォルトの名無しさん
21/05/27 16:09:02.89 kQVwJQto.net
>>89
1つめのリンクでは
結合する主体は参照を宣言するコンテキストだね
結合される客体がオブジェクトである点は変わってない
数学や他言語がどうたらには付き合ってやんね
ちゃんとC++の話のなかで例えるなら
実体定義と外部宣言はどちらが使われる側と使う側なのか
のような話だろ

92:デフォルトの名無しさん
21/05/28 04:05:49.41 cE/PGHSY.net
そことは直接関係ないけど、cppreferenceの英語版って、英語として文法的におかしい
ことが有る気がする。主語が無くていきなり三人称単数現在のsが付いた動詞で
始まっている文章も、見出しの直後ならダメではないが、見出しの直後以外の
if節の後にあったりして、しかもそれがif節の中に繋がっていなくて、本来なら
主語を省略できない場合とか。
Microsoftの英語版はすらすら読めるけどcppreferenceの英語版は読めない。

93:デフォルトの名無しさん
21/05/28 04:22:43.88 bFqxphgp.net
int 配列の参照って
int (&a)[N]
であって
(int&) a[N]
じゃないよね?
後者は「参照の配列」を意味するようで変なのは分かるんだが、前者は前者でどこに&ついてんねんって感じなんだが

94:デフォルトの名無しさん
21/05/28 04:30:30.62 O9o6B/0s.net
>>91
てにをはがおかしいのは日本国憲法に比べればかなりマシ。がまんしろ

95:デフォルトの名無しさん
21/05/28 04:57:54.48 0J3ydS6A.net
>>92
>int (&a)[N]
それは、数学記号の様に読み取ることが出来る。
()は優先順位を変えているだけ。
優先順位に従って書いてみると、
a --> & --> [N] --> int
となる。これにより、
「a は、参照で、それは、[N] を指し、その要素は int である」
と読めて、もう少し自然な言語に直すと
「a は、参照で、それは、N要素の配列を指し、その配列の要素は int である」
となり、さらにわかり易くすると、
「a は、要素が int の配列を指している参照である」
となる。このように数学の式変形の様な工程を経ているだけの、単なる計算の様な
ものに過ぎない。

96:デフォルトの名無しさん
21/05/28 05:01:18.55 0J3ydS6A.net
>>94
[補足]
a --> & --> [N] --> int
を英語で読んでみると、
「a is & to [N] to int」
となる。& を「reference」、[N]を「N要素のarray」に置き換えてみると、
「a is reference to "N要素の配列" to int」
となる。日本語に直せば、
「aは、int 型の N要素の配列への参照」
となる。

97:デフォルトの名無しさん
21/05/28 05:51:02.47 bFqxphgp.net
それはたとえば
int (a&)[N]
などを禁止する理由になってるだろうか

98:デフォルトの名無しさん
21/05/28 06:18:19.72 fuFcwWPl.net
参照修飾子はすぐ右にある対象を修飾する

99:デフォルトの名無しさん
21/05/28 06:24:24.88 Q2cy611+.net
>>39
> 2つの文字列リテラルの共通部分列の長さをコンパイル時定数として扱う
をやろうとして苦戦しています
再帰 constexpr 関数で計算しようと思ったんですが、引数として受け取った文字列リテラルの要素って定数と見なせないですよね?
そもそも無理か、勉強次第でできるかだけでも教えていただけたらありがたいです

100:デフォルトの名無しさん
21/05/28 12:14:40.97 sAi5WsuI.net
>>96
(a&)
の部分は、()は優先順位を変えているだけなので、コンパイラは
a&
という部分式を認識しようとする。しかし、a& という部分式は
C++では文法的に存在して無いのでエラーとなる。
単にそれだけの事。

101:デフォルトの名無しさん
21/05/28 12:22:24.96 sAi5WsuI.net
>>99
[補足]
C++コンパイラが
int x[N];      // (1)
というテキストをパースする際、コンパイラ内部では、
x --> [N] --> int
という順序の演算が並んでいると理解されている。そして、
int (&a)[N]     // (2)
というテキストをパースする時、優先順位括弧があるために、
(1)において、x を &a に置き換えたようにコンパイラは理解するなので、
数学の式変形での「代入」のように考えて、
&a --> [N] --> int   // (3)
のようになる。そしてさらに、&a は、a --> & のように式変形されるので、
(3) に安全のために優先順位の()を付けてそれを「代入」すると、
(a --> &) --> [N] --> int   // (4)
となる。しかし、この場合、優先順位の括弧ははずせるので、
a --> & --> [N] --> int   // (5)
となる。ここで、もとのテキストが、
int (a&)[N]     // (6)
だったならば、x が a& に相当することになるが、a& という部分式はC++には
存在しないので、そこでエラーになる。

102:デフォルトの名無しさん
21/05/28 12:48:09.21 sAi5WsuI.net
>>100
[さらに補足]
C++では、「宣言文」と地の文における「式」とは別扱いになっている。
なので、式における &a と宣言文における &a では、& の意味が異なる。
今回の場合は「宣言文」。
宣言文における &a は、a が参照型であることを意味する。
式における &a は、a のアドレスを取得する演算子である。
> x --> [N] --> int
> という順序の演算が並んでいると理解されている。
において「演算」と書いたのは、適切な言葉が見つからなかったため。
演算といっても、今回は宣言文ので、式における演算子とは意味が違う。
式に置いて x[y] は、常に *(x+y) と等価な演算子であるが、
宣言置いて x[N] は、演算子ではなく、x が N要素の配列型であることを
意味しているだけである。
また、最後の xxx --> int も演算子ではなく、型指定部と呼ばれ、
xxx の部分が int 型であるということを意味しているだけである。
しかし、コンパイラ内部では、
x --> [N] --> int
のように意味解釈がされていることだけは確かである。

103:デフォルトの名無しさん
21/05/28 12:59:39.48 yA47hu4B.net
>>101
> 「演算」と書いたのは、適切な言葉が見つからなかったため
抽象構文木?
長いしもうちょっと整理してから書いてや
独自記法もやめてな

104:デフォルトの名無しさん
21/05/28 13:02:59.68 sAi5WsuI.net
>>102
抽象構文木とは限らない。

105:デフォルトの名無しさん
21/05/28 13:10:26.55 sAi5WsuI.net
>>102
整理すると理解できないと思うぞ。
俺は個の痛手は良く馬鹿にされるが、IQは170くらいある。

106:デフォルトの名無しさん
21/05/28 13:20:08.34 fuFcwWPl.net
IQが20違うともう対話が成立しないって聞いたことがある

107:デフォルトの名無しさん
21/05/28 13:31:32.53 ymLe7hdU.net
「a&は禁止されてるから禁止」て言ってるだけじゃねえか
バカなのかコイツ

108:デフォルトの名無しさん
21/05/28 14:17:05.39 sAi5WsuI.net
>>106
そうじゃない。a& という部分式が、記号として未定義と言っている。
禁止じゃなく、未定義。数学でも、
-a
は符号反転とか、負符合という意味で定義されているが、
a-
は定義されていないのと同様。
禁止ではなく、定義されない。だからエラーになる。

109:デフォルトの名無しさん
21/05/28 14:21:07.08 yA47hu4B.net
「パーサーが受理しない」なら言っていい

110:デフォルトの名無しさん
21/05/28 14:40:50.20 fuFcwWPl.net
未定義って言ってんじゃん
パーサーなんて規格票で使わない用語を持ち出す必要ねえよ

111:デフォルトの名無しさん
21/05/28 14:40:59.94 sAi5WsuI.net
>>108
それでは、なぜ受理(認識)しないのかという理由が曖昧。
理由は、そのトークン列が「未定義だから」。

112:デフォルトの名無しさん
21/05/28 14:46:15.77 yA47hu4B.net
>>110
還元できる構文規則がないからだよ
redexは非終端記号も含むから「トークン列」はそもそも誤り

113:デフォルトの名無しさん
21/05/28 14:50:28.42 sAi5WsuI.net
>>111
専門用語をなるべく使わずに平易に説明してるつもりだった。

114:デフォルトの名無しさん
21/05/28 14:55:24.82 sAi5WsuI.net
俺は、非終端記号、構文規則、redex、受理みたいな専門用語はなるべく使わずに、
生まれながらの頭の良ささえあれば理解できる様に書いたつもりだ。
だから、他に本などを読まなくても俺の説明をちゃんと読めば、数学的に高IQの人なら
理解できるはず。

115:デフォルトの名無しさん
21/05/28 15:32:28.15 noi5k0SL.net
>>105

116:デフォルトの名無しさん
21/05/28 15:39:25.96 fuFcwWPl.net
> 独自記法もやめてな
脳天にどでかいブーメランぶっ刺さってんぞw

117:デフォルトの名無しさん
21/05/28 19:49:19.58 ymLe7hdU.net
定義されてないから未定義なのか
定義できないから未定義なのか
未定義にしている理由なら、禁止してるから定義にないのは当然じゃん
定義にあるのは許可されたやつだけだから禁止されたものは書かれてない
定義に無いから禁止されてる
未定義=禁止であって、未定義なのは禁止されてるから
なんで無いのかを聞いてるんだからどっかで禁止されたんだろ
で、答えが「未定義だから定義には無い」「禁止されたから禁止されている」何も言ってないじゃないか
なんでそのルールが無いのか、ルールそのものには書�


118:「てないじゃん



119:デフォルトの名無しさん
21/05/28 20:19:45.17 cxRyZpXl.net
>>116
???
c++標準で未定義と定義されているのが「未定義」だろ。
>定義されてないから未定義なのか
>定義できないから未定義なのか
どちらもc++の「未定義」じゃない。
c++標準くらい読めよ。

120:デフォルトの名無しさん
21/05/28 20:26:19.34 9RgT2QcU.net
関数呼び出し時の引数の評価順は未だに未規定(unspecified)ですね
でも未定義(undefined)ではない
最適化をしやすくするためとか

121:デフォルトの名無しさん
21/05/28 20:42:46.54 ymLe7hdU.net
コイツが言ってんのは、構文解析の規則にないから未定義であり禁止、だろ
禁止されてんのは構文規則には入ってないです、未定義だからです、だから禁止です、ってな
そりゃ構文規則には受理する規則だけが書いてあるだけなんだから受理しない規則は書いてない
定義しない理由があったんならそりゃ禁止する理由だ
でなければ定義に書かれている
構文ルールに入って無いのはそのルールが未定義なのか禁止されてるだけなのかそもそも定義できないのか、それは分からないだろ
だから禁止されているかどうかの答えにはなってない
禁止されたから構文ルールには入ってねえんだよ

122:デフォルトの名無しさん
21/05/28 23:14:02.41 /t1wIdDl.net
ある入力を受理するかどうか未定義ってどうやって書くんじゃ……
わざとあいまいなNFAにでもするのか…………
つかBNFはPDAなのでは……………………
PDNFAみたいなもんがこの世にはあるんか…………………………………………

123:デフォルトの名無しさん
21/05/29 01:22:28.79 3Clqo4vt.net
初期化されてない自動変数やポインタを使うのはスリルあるね

124:デフォルトの名無しさん
21/05/29 01:28:07.59 ppnc++Os.net
>>120
構文規則には、その言語(C/C++など)で定義されたパターンを、非終端記号と終端記号を
組み合わせてBNFなどを使って書く(その構文規則をコンパイラ理論では「文法」と呼んでいる。)。
トークン列が、その構文規則のパターンに当てはまる場合、「認識された」という。
このとき、認識されないトークン列はエラーであり「受理されない」。
ようは、文法規則に当てはまってないトークン列が、「受理されない/未定義」。

125:デフォルトの名無しさん
21/05/29 01:39:13.51 QJfgb1eG.net
>>116
C++の宣言文において、&x を x が参照型であることを意味する文法を最初に
定義するのは、人間。そういう言語にしたいからそうしただけ。
そしてその文法は、(必須ではないが)、BNFなどを使った構文規則として仕様公開される。
C++の構文規則には、x&というパターンは書いてない。
なので、積極的に「禁止」しなくても、トークン列にx&というものが現れても、
どの構文規則にも「マッチング」しないのでエラーが表示される。
それだけのこと。

126:はちみつ餃子
21/05/29 02:08:34.72 F7QShN9h.net
仕様が提示する構文規則 (BNF) に合致しないというレベルの違反は診断対象規則 (diagnosable rules) に反するので処理系がユーザに通知する義務はある。

127:デフォルトの名無しさん
21/05/29 02:51:05.83 gVnTXjgE.net
>>122
受理されなかった入力は非マッチなのであってエラーの一択なのでは……

128:デフォルトの名無しさん
21/05/29 02:53:15.80 gVnTXjgE.net
>>123
x&とかxが型なら普通にパターンとして現れるのでは…………

129:デフォルトの名無しさん
21/05/29 03:11:30.39 gVnTXjgE.net
「C++の構文規則にマッチする入力テキストの集合」が一意確定になることを疑う理由は無いから
入力テキストにわざわざ未定義などというクラスを設けるする必要は無いのでは……………………

130:デフォルトの名無しさん
21/05/29 03:13:13.35 QJfgb1eG.net
>>126
構文規則の中に x&y は存在しているが、x&単独では存在していない。
だから、z = x&y; や z=(x&y) は受理されるが、z = x&; や z=(x&)
はエラーになる。

131:デフォルトの名無しさん
21/05/29 03:14:43.85 QJfgb1eG.net
>>126
おっと、読み間違えた。
xが型の場合は受理されるよ。
xが名前トークンの場合は受理されない。

132:デフォルトの名無しさん
21/05/29 03:21:31.22 QJfgb1eG.net
>>129
[補足]
・xが名前トークンでも意味論的にxが型名とみなせる場合にはxは型だと扱われる。
・xが変数名の場合には変数だとみなされる。
・xが変数名の場合には、x&yは文法の中の有る規則にマッチングするので
 受理されるが、xが変数名の場合にはx&という文法規則は存在してないので
 どんな文法規則にもマッチングできないのでエラーになる。

133:デフォルトの名無しさん
21/05/29 03:24:12.95 QJfgb1eG.net
>>130
[さらに補足]
・xが(ユーザー定義の)型名の場合でも、それが現れる文脈次第で
 x&が受理され無い事がある。
 文脈によって受理されるパターンが違うので。

134:デフォルトの名無しさん
21/05/29 16:51:48.20 thkl3N6c.net
たぶんくそしょうもない質問いいですか
コンストラクタの初期化子リストで
まさに今初期化したばっかりの他のメンバを使うのはアリですか
class Foo{
Foo(Bar bar,Baz baz);
Bar bar_;
Baz baz_;
...
};
Foo::Foo(Bar bar,Baz baz)
:bar_(42)
,baz_(bar_) // ← これ
{...
自分の環境では動いてるようですが
規格に照らし合わせて合法なものなのでしょうか?

135:デフォルトの名無しさん
21/05/29 16:59:07.85 RxiQSMqK.net
>>132
クラスのメンバ変数は定義に書かれた順に初期化されるから、その例についてはokなんじゃないかな

136:はちみつ餃子
21/05/29 17:29:48.88 F7QShN9h.net
メンバ初期化子として書いた順ではなくクラス定義内のデータメンバ宣言順に従うというのが重要ポイントで、
勘違いを防ぐために宣言順とメンバ初期化子の順序は一致させるのが一般的な習慣になってる。
(一致させなくてもそれ自体は規格違反ではない。)
C++20 から入る指示付初期化 (Designated initialization) で順序を一致させるのが必須に
なっているのはこのへんの反省があったんだと思う。

137:デフォルトの名無しさん
21/05/29 19:10:01.56 thkl3N6c.net
各位 ありがとう
>>134
後半はへーって感じなので調べてみる

138:デフォルトの名無しさん
21/05/31 20:14:45.42 OyXVhXUR.net
構造化束縛とか範囲for文が必ず新規にオブジェクトを宣言しないといけない仕様になってるのが何気に解せないのだが
既存のオブジェクトを使い回せた方が都合良いだろうに、なぜこういうことになったの?

139:デフォルトの名無しさん
21/05/31 20:47:21.20 6/QCGWOG.net
構造化束縛の方はtieで行けるだろ
int a, b;
std::tie(a, b) = std::make_pair(1, 2);

140:デフォルトの名無しさん
21/05/31 20:48:51.74 7Qq6EdKQ.net
参照じゃダメ?

141:デフォルトの名無しさん
21/05/31 21:28:28.96 s2XLu44M.net
c++11やり始めた頃、for(auto& e:~やfor(const auto& e:~と出来るのを知らず、酷いコードを大量に垂れ流してしまったよ

142:デフォルトの名無しさん
21/05/31 22:31:51.93 OyXVhXUR.net
>>138
参照にしてもfor文のスコープ外で宣言できた方が都合が良いことがままある

143:デフォルトの名無しさん
21/06/01 01:12:38.27 reo3/Kbw.net
ループの最後の値を使いたいという事?

144:デフォルトの名無しさん
21/06/01 09:11:18.08 qu3686ge.net
>>140
言っても「稀に」程度だろうし、やりたければスコープ外で宣言した変数に代入すれば済む。
何を問題としているのかわからない。

145:デフォルトの名無しさん
21/06/01 12:18:45.46 GfvVYbqX.net
お漏らし推奨

146:デフォルトの名無しさん
21/06/01 12:20:20.23 cpTyMADV.net
自作関数の引数を initializer_list にするのってなんか使い道あるんですか?
参照の組を渡せる?

147:デフォルトの名無しさん
21/06/01 18:21:02.43 S9WvGpu9.net
MyVector v{1,2,3,4,5};
とかできる

148:デフォルトの名無しさん
21/06/01 20:14:13.74 Y6fKUmaQ.net
ま、まいべくたーw

149:デフォルトの名無しさん
21/06/02 06:27:13.91 P6q02jmG.net
>>145
コンストラクタの引数にするくらいしかメリットないの?
前スレ掘ってたら、同じ型の参照の組なら initializer_list で関数に投げれるってのを見つけたんだ�


150:ェそれはどうやんの initializer_listを引数にとる関数 hoge を hoge({fuga, var, aaa}) って呼び出したら実体を渡してることになるよね?



151:デフォルトの名無しさん
21/06/02 06:48:10.69 2dvb28jp.net
MyVector(initializer_list<reference_wrapper<int>>) { }

152:デフォルトの名無しさん
21/06/02 07:01:45.97 P6q02jmG.net
>>148
それって vector< reference_wrapper<T> > とは違うんけ?

153:デフォルトの名無しさん
21/06/02 07:55:44.63 2dvb28jp.net
template <class T>をつけるならね

154:デフォルトの名無しさん
21/06/02 07:57:13.92 2dvb28jp.net
reference_wrapperはC++11からでC++03にはないから> >にする意味ないぞ

155:デフォルトの名無しさん
21/06/02 08:15:03.57 c6cNO3VA.net
初期化のときに登場する{}が初期化子リストだと言うことがつい最近判明した
概念を区分して分離したのが一番大きいので、用途についてはあまり考えられていない

156:デフォルトの名無しさん
21/06/02 08:44:42.49 P6q02jmG.net
>>151
いや自分の可読性のためにそうしてるだけ
他の人にとってはそっちの方が見づらかったらすみません
それはそうと、関数に参照の組を渡すなら、initializer_list 云々というよりは reference_wrapper の組として渡すってことですね
もう一点、関数に initializer_list を渡すときって
・関数の引数の型が initializer_list である
よりも
・関数の引数のコンテナを initializer_list で初期化している
の方がしっくりくるんですが、前者で設計するメリットってありますか

157:デフォルトの名無しさん
21/06/02 10:14:59.83 qtmfAhQ7.net
overloadに弱くなる

158:デフォルトの名無しさん
21/06/02 10:21:56.66 2dvb28jp.net
>>153
長かったC++03時代でそういうクセが染みついちまった、ならわかる

159:デフォルトの名無しさん
21/06/02 10:48:08.32 zppGp/iM.net
気狂いいてワロ
(a, b, c) と ( a, b, c ) さえどちらが良いかなんて誰にも決められないのに、なぜ < <> > と <<>> なら後者の方が問答無用で良いと思い込んでるのだろうか
こういう、一概には言えないことを押し付けるタチの異常者が回答側に回ってるのイタ過ぎだろ

160:デフォルトの名無しさん
21/06/02 10:51:36.57 qtmfAhQ7.net
同和ンゴ

161:はちみつ餃子
21/06/02 11:11:42.37 Bcy6nIKX.net
トークン分割の段階では >> というひとつのトークンとして切り出された上で
構文解析の側で辻褄を合わせるという変な解釈が不格好だから好きじゃないな。
構文が複雑になる分には仕方がないと割り切れるんだが、
異なるレイヤをまたいで辻褄合わせするのってなんか嫌じゃない?
でもまあ > > よりは >> のほうが見やすい気がするからそう書いてるんだけど、
割とモヤモヤしがち。

162:デフォルトの名無しさん
21/06/02 11:13:17.27 2dvb28jp.net
何で押しつけたことになるんだ?
被害妄想で攻撃的になるやつこそ病んでるぞ
スタイルは案件ごとにある
そこでいらぬ波風立てるやつは叩き出される
仕事は成果で語るものなのに勘違いして
つまらんことに気を取られるやつは使い物にならん

163:デフォルトの名無しさん
21/06/02 11:41:07.35 vfPidZYU.net
>>149
おそらく初期化子リスト版の方が高速に動作する
まぁ、今時のコンパイラの最適化は変態レベルに進化してるから結局同じようなコードに落ち着くかもしれないけど

164:デフォルトの名無しさん
21/06/02 11:54:53.84 P6q02jmG.net
>>154
initializer_list をとることにしておけばコンテナの種類を決めておく必要がないから得ってことですか?

165:デフォルトの名無しさん
21/06/02 12:01:59.24 zppGp/iM.net
>>159
> スタイルは案件ごとにある
元質問はスタイルが指定された案件では全くないので、自分が頓珍漢なこと言ってたって認めるわけね
> そこでいらぬ波風立てるやつは叩き出される
> つまらんことに気を取られるやつは使い物にならん
狂おしいまでに己のことだな

166:デフォルトの名無しさん
21/06/02 12:11:17.92 2dvb28jp.net
>>162
元質問には特定の案件か否かはどちらとも書いていないね
さらに俺は特定の案件の話だともそうでないとも言ってない
次から次へと勝手に決めつける軽率なやつが
他人に向かって頓珍漢とか天に唾するってやつだぜ

167:デフォルトの名無しさん
21/06/02 12:24:56.03 e/VYBb4b.net
恥ずかしくなってネタっぽくしてるが隠しきれてない同和ンゴ

168:デフォルトの名無しさん
21/06/04 15:31:20.39 Lunsq3fv.net
cout と cerr に同じもん流し込みたいときって
cout << hoge;
cerr << hoge;
ってやるしかない?
一行というか一文で書けたら楽だが

169:デフォルトの名無しさん
21/06/04 15:57:51.35 xvizFE5L.net
>>165
すなおに以下のようなマクロにしとけばどうかな
#define HOGE(x) std::cout << x; std::cerr << x;
例えば以下のように使う
HOGE(hoge << endl);

170:デフォルトの名無しさん
21/06/04 17:29:57.12 7u0nl5aT.net
random_device{}();
の中括弧って何なん
デフォルトコンストラクタで構築するってこと?
なんで丸括弧じゃないん

171:デフォルトの名無しさん
21/06/04 18:26:04.60 XeNJRf+j.net
別に中()でも問題なくない?

172:デフォルトの名無しさん
21/06/05 05:37:22.25 Fi/fLauk.net
ラムダ式のキャプチャ構文の個別コピーとか個別参照がなんで存在するのかイミフなんだが
引数で良いじゃん

173:デフォルトの名無しさん
21/06/05 07:13:07.04 RvyziTet.net
キャプチャにもコストは掛かるから必要なものだけ最小限キャプチャしたい時に必要なんだよ
なぜ引数でいいと思うのかはイミフ

174:デフォルトの名無しさん
21/06/05 07:24:52.28 qiBnX5wX.net
既存の関数ポインタや関数オブジェクトと整合性を取るには、寿命やスコープの異なる変数を使うための仕組み(キャプチャ)が必要だったからでしょ

175:デフォルトの名無しさん
21/06/05 07:29:08.22 qiBnX5wX.net
とあるラムダ式を読みづらいと感じるならそこでは使わないほうがいい
煽っているわけではなくて、ラムダ式の存在意義は可読性の改善なので、ラムダ式を読みづらいのは本末転倒だからね

176:デフォルトの名無しさん
21/06/05 07:39:00.13 ywjQFJII.net
>>170
キャプチャデフォルトにしても使わなかったやつはキャプチャされないから
あえて個別にするのは何か理由があるときだね

177:デフォルトの名無しさん
21/06/05 08:28:34.32 NuQvqfvD.net
>>170
キャプチャできるオブジェクトってみんな引数としても渡せるじゃん
参照、const参照、コピーも自由自在だし
コストって言うけど、参照キャプチャと参照渡し、コピーキャプチャとコピー渡しってコスト違うの?
一応断っておくと[&]と[=]の存在意義は分かる
オブジェクトを個別にキャプチャするのがイミフってだけ
「こういうときに使う。引数渡しではできない」という例があったら教えていただきたいです

178:デフォルトの名無しさん
21/06/05 08:43:36.40 hPuZ+cGi.net
ラムダ式がキャプチャするタイミングと呼び出すタイミングは違ってもいい

179:デフォルトの名無しさん
21/06/05 08:53:12.54 qiBnX5wX.net
呼び出し時にキャプチャ元の存在は保証されない自己責任

180:デフォルトの名無しさん
21/06/05 09:10:01.93 ywjQFJII.net
>>174
これを引数渡しではどう書く?
random_device dev;
int ary[256];
generate(begin(ary), end(ary), [&]{ return dev(); });

181:デフォルトの名無しさん
21/06/05 09:10:44.09 S25kPsaU.net
>>175
なるほど
コピーしたいけど呼び出しの度には嫌だ、というときに役立つのか
神機能だな

182:デフォルトの名無しさん
21/06/05 09:11:42.81 S25kPsaU.net
>>177
もう解決しました

183:デフォルトの名無しさん
21/06/05 09:21:58.27 tBDt+1bH.net
>>176
コピーならHOSYOUされる
>>178
つか新しい関数を作る機能
>>169
カリー化

184:デフォルトの名無しさん
21/06/05 09:28:59.14 tBDt+1bH.net
普通のキャプチャ(コピー)ではなくて
異常なキャプチャ(参照のキャプチャ)なら呼び出し時にキャプチャ元(参照されているオブジェクト)
の存在はHOSYOUされないから注意しないとKIKENだが
なんでそんな機能があるのかというとオブジェクトをカリー化(?)する場合にあったら便利だねえ、ぐらいの勢いの話
普通のキャプチャだけでもポインタをキャプチャしたら同じことができる

185:デフォルトの名無しさん
21/06/05 09:37:27.71 tBDt+1bH.net
もっとも、自動変数として作られたオブジェクトxをキャプチャする場合、
xを参照のキャプチャする代わりに&xを普通のキャプチャしてしまうと
(「&」演算子が使われたことにより)微
妙に最適化に響きかねない問題というのは微妙にあるが微妙なので普通は気にするほどではないはず……

186:デフォルトの名無しさん
21/06/05 09:53:54.69 qiBnX5wX.net
元のデータをFUCKYUできないような書き方はAUTO

187:デフォルトの名無しさん
21/06/05 10:05:44.68 ywjQFJII.net
キモい言葉遣いヤメレ

188:
21/06/05 15:25:47.75 CJl2tIqC.net
ヒドロキシクルルキン
イベルメクチン

189:
21/06/05 15:26:27.50 CJl2tIqC.net
ヒドロキシクロロキン
イベルメクチン

190:デフォルトの名無しさん
21/06/05 16:15:28.53 ftrSVS/I.net
C++において関数は第一級オブジェクト
なのに C++ が関数型プログラミングを全く想定していない仕様に思えるのはなぜ

191:デフォルトの名無しさん
21/06/05 16:15:54.58 ftrSVS/I.net
関数型のパラダイムもうまく取り込んでほしい

192:デフォルトの名無しさん
21/06/05 16:34:45.82 Cv4CPRao.net
>>187 古いから。
>>188 提案するのは自由だから、がんばって。

193:デフォルトの名無しさん
21/06/05 16:53:27.35 KLv4XYoF.net
>>187
c++の関数は第一級オブジェクトじゃないだろ。
高階プログラムはテンプレートという別の仕組みでサポートしている。

194:デフォルトの名無しさん
21/06/05 18:54:44.68 V38nFCWr.net
関数型プログラミングは別に古くないはず……
GENJITSU世界が状態を持ち破壊的代入を伴うから
まだチューリングマシン的な計算モデルの方が対応がとりやすい(気がする)だけ
C/C++が関数型プログラミング一本鎗にならないのはそれが根本原因

195:デフォルトの名無しさん
21/06/05 20:10:51.62 rl6U/q41.net
・弱体化された関数型の機能
・構造化プログラミング
・GOTO文
これがCだよ
で、多分70年代当時は関数型プログラミングはおそらく過去の遺物になってた
でないとこの頃のlispの失速が説明つかない

196:デフォルトの名無しさん
21/06/05 20:22:19.29 RvyziTet.net
当時生まれてないけど
あのマシン性能が貧相な時代によくLISPなんて流行ってたな

197:デフォルトの名無しさん
21/06/05 20:31:42.60 lZ3sFmcT.net
むしろマシンリソースが少ない時代だからこそ流行したといえる
LISPマシンはすなわちスタックマシンだ
複雑な語句パーサーとツリー構造の構築がなくても、ストリームから
はいってきたキーワードを順繰りに解釈してスタックにつんでいき
かっこが閉じたらスタックからひっぱればちゃんと動くものがつくれる

198:デフォルトの名無しさん
21/06/05 20:53:06.54 ywjQFJII.net
>>190
禿は「第一級オブジェクト」をテンポラリでないオブジェクトと言っているようだが

199:デフォルトの名無しさん
21/06/05 21:21:58.41 XO/wZGzq.net
権威者がこれこれと言ってたからこれこれであるという話の持って行き方は
今日の世界では小学生レベルの人間しかしない
中世ヨーロッパでは過去の偉人の言葉をいかにうまく引くかが議論の上手下手を左右したらしいが

200:デフォルトの名無しさん
21/06/05 21:28:06.29 ywjQFJII.net
その世界の教祖のような人でも一切、言葉を引いてはいけないのか
小学生で年収1000越えそうな人ってジュジュちゃんとかいるけど
自分の年収を棚に上げてわかったようなことをw

201:デフォルトの名無しさん
21/06/05 22:00:37.95 ECg4taz5.net
>>194
それForthじゃね?

202:はちみつ餃子
21/06/05 22:00:51.75 G0EcoOQC.net
>>196
ここで必要なのは範例ではなく定義。
何が正しいのかを議論したいわけじゃなくてどの定義を使う「ことにする」という擦り合わせ。
C++ における定義を決めるなら設計者の言を元にするのは妥当だろ。
それはそれとして >>195 はなんかおかしいこと言っていると思うし、
なんか勘違いしてそうな気がするが。

203:デフォルトの名無しさん
21/06/05 22:49:20.33 V38nFCWr.net
関数型プログラミングが古いと主張する香具師は
MVCとかなMと表示等が分離した設計モデルでありかつ
Mがマルチスレッド(UIスレッドとは別)なケースのプログラミングを
ラムダ式を使わずにして見られれば宜しい
すっきり収拾をつけるにはコールバック関数として関数オブジェクトを渡すか、
コールバック関数をvoid*引数の関数にするという前近代的な設計にするかしかなく、
classを使って手で書く関数オブジェクトはラムダ式を見たコンパイラが生成するコードと大差ないから
前者は関数型プログラミングに他ならない
という印象、
※ 個人の感想です
それはそれとして>>192も相当おかしいことを言っていると思うし以下略

204:デフォルトの名無しさん
21/06/05 23:04:19.70 V38nFCWr.net
Promiseを使っても同じことで、
ていうかPromiseこそあるスレッドXを実行後に行うべき処理を行う関数Fを
スレッドXの終了後に実行するために(※1)内部で作っておくのだから関数型プログラミングに他ならない
関数型プログラミングパラダイムは全世界をあまねくみそなわしておられる、
※1: 実行する、というといかにも命令型プログラミングな感じだが、
   関数型プログラミングパラダイム的には関数Fを展開することで計算を遂行する、と解釈されたい

205:デフォルトの名無しさん
21/06/05 23:25:00.00 XO/wZGzq.net
>>197
年収が人間の価値だと思う人って今でもいるんだね

206:デフォルトの名無しさん
21/06/05 23:41:37.67 L7L31nHe.net
関数型の実戦で使えるエッセンスは10年前から各種人気の言語で取り込まれ、
具にも付かない思想倒れな部分は取り込まれなかった。それだけ。

207:デフォルトの名無しさん
21/06/05 23:54:03.24 YIeCSJoh.net
>>196
上下を左右するとな。
今日一番心に残った表現だ。

208:はちみつ餃子
21/06/06 02:06:47.21 KdK5uVMj.net
Scheme だとプログラムの流れ (関数を呼出したり戻ってきたり) を継続の起動の連鎖として
定義づけているが、継続の概念の元になったのは並列計算の研究から生まれたアクター。
アクターにメッセージを送るのと関数呼出しが実装上は同じになってしまったという気づきから継続の概念へと整理されていった。
関数型とオブジェクト指向は整理の仕方が違うだけで
(といっても人間が使う以上はどのようなメタファで整理されているかも大事でもあるんだけど)
より抽象的なレベルで見ると同じことをやっている。
そんで並列計算は (理論上は) どっちでも織り込み済みなのでパラダイムによって
どちらのほうが並列計算しやすいということもない。
差があるとしたら単に言語の設計の出来栄えとかライブラリの整備とかのレベルの話なんで、
パラダイムにまで踏み込んで考えるような話じゃないよ。

209:デフォルトの名無しさん
21/06/06 07:44:49.65 uVO5juz1.net
高所得者「年収が人間の価値だと思う人って今でもいるんだね」
低所得者「年収が人間の価値だと思う人って今でもいるんだね」

210:デフォルトの名無しさん
21/06/06 08:33:32.64 MV541K/D.net
>>203
C++に取り込まれた、実践で使える関数型のエッセンスってどんなん

211:デフォルトの名無しさん
21/06/06 08:36:03.93 xXlGkHu+.net
bind

212:デフォルトの名無しさん
21/06/06 10:44:07.49 +heRuwS3.net
深さが任意の入れ子の vector を一次元 vector に展開したいんですが、良いやり方ありますか
再帰すれば良いと思うんですがどういう条件で分岐すれば良いかわかりません

213:デフォルトの名無しさん
21/06/06 11:34:06.74 5eq/ZHJS.net
入れ子を一階層だけ展開する処理を書いて
入れ子がなくなるまで末尾再起するというのはどうだろうか

214:デフォルトの名無しさん
21/06/06 11:37:51.02 +heRuwS3.net
>>210
今見てる階層の一個下がvectorか値かっていうのはどう判定したら良いですかね?

215:デフォルトの名無しさん
21/06/06 11:56:07.70 W7O34OA1.net
>>209
これ
flatten - 1.57.0
URLリンク(www.boost.org)

216:デフォルトの名無しさん
21/06/06 12:00:46.49 W7O34OA1.net
大抵の言語でその手の挙動はflattenと呼ばれてる
Yet Another Common Lisp Problems
URLリンク(www.nct9.ne.jp)

217:デフォルトの名無しさん
21/06/07 08:16:50.61 we1Omxer.net
>>197
肝心なのは「誰が言ったか」ではなくて、「(言った)意味、中身」。
さもないと「権威に訴える論証」にひっかかるから気をつけな。
わかってやっているなら詐欺師だし。

218:デフォルトの名無しさん
21/06/07 09:33:53.85 3qfiWg/V.net
>>210
ちょっとググった感じだと、vector<T> が vector かどうか判定する is_vector ってないんですね
あと is_array は std::array を array と見なさないみたいな情報もあって、メタ関数は罠というか勘違いが多そうで怖いですね
現状、自分で is_vector を実装するしかないんですかね?
ごく基本的な処理に思えるので、シンプルな解法というかイディオムみたいのがあれば教えていただきたいです

>>212
ありがとうございます。が、今は自分で書くならどうなるかというところに興味があります
boost の flatten のコードはいろんな場合に対応するべく難解になっていそうですが、どうにもならなかったら参照してみます

219:デフォルトの名無しさん
21/06/07 09:55:32.64 BbDyCKOj.net
>>215
正直、まず>209の「深さが任意の入れ子の vector」をどう定義してるのか見せてもらわないと話が見えてこない気がする。
要素型が固定なら要素型のほうで判定すれば is_vector は要らないだろうし、
variant とか使ってる場合もやっぱり is_vector の出番は無いだろうし。

220:デフォルトの名無しさん
21/06/07 10:34:55.50 RKkN9u5/.net
>>216
vector< vector< ... vector<T> > ... > で、T は correction (vector, array 等) じゃない、というのを想定しています
仮定が足りませんでしょうか

221:デフォルトの名無しさん
21/06/07 10:44:19.30 OrLbPX6K.net
>>214
偉そうにキリるなら「第一級オブジェクト」の公式な定義をまず出せ

222:デフォルトの名無しさん
21/06/07 10:49:36.03 OrLbPX6K.net
>>215
作るったって大した話じゃねえべ
template <template<class...> class T> struct is_vector : false_type { };
template <> struct is_vector<vector> : true_type { };
template <template<class...> class T> constexpr bool is_vector_v = is_vector<T>::value;

223:デフォルトの名無しさん
21/06/07 10:54:39.46 BLDePS2Q.net
>>217
numpy の reshape / flatten / ravel みたいなの想定してる?

224:デフォルトの名無しさん
21/06/07 11:00:59.34 BbDyCKOj.net
>>217
それじゃ深さ固定じゃね?・・・深さの違ういくつかのケースを扱うっていうことか。
T を受け取るオーバーロードとそれ以外を受け取るオーバーロード書けばおしまいな気がする。

225:デフォルトの名無しさん
21/06/07 11:02:02.86 BbDyCKOj.net
(要素ごとに深さが異なることもあるのを想定してた。)

226:デフォルトの名無しさん
21/06/07 11:12:04.97 3qfiWg/V.net
>>219
ありがとうございます
よく知らない構文も混ざってるので、勉強します

>>220
はい
flatten をしたいです

>>221
template<class T> T flatten(vector<T>)

template<class T> T flatten(T)
ってことじゃないですよね?

>>222
>>217ってそれ含みませんっけ?

227:デフォルトの名無しさん
21/06/07 11:14:17.08 3qfiWg/V.net
そもそも厳密な書き方じゃないので、含むか含まないかわかりませんね
今は含まないということにします

228:デフォルトの名無しさん
21/06/07 11:59:15.70 0mm9pDbq.net
>>218
そもそもc++には「第一級オブジェクト」なんて定義されてないだろ。
c++標準に"first-class object" なんて記載あったかね。
一般的な解釈はwikipediaでも勉強しろよ。

229:デフォルトの名無しさん
21/06/07 12:01:22.38 OrLbPX6K.net
>>225
ここはC++スレだ
一般的な解釈なんて頓珍漢なこと言ってんな
そっちへ逃げたければ1人で逃げろ
俺は付き合ってやんね

230:デフォルトの名無しさん
21/06/07 12:05:00.74 0mm9pDbq.net
>>226
だったら「第一級オブジェクト」なんて頓珍漢なこと言ってんな
そっちへ逃げたければ1人で逃げろ
俺は付き合ってやんね

231:デフォルトの名無しさん
21/06/07 12:08:12.54 OrLbPX6K.net
>>227
流れくらい読めよ
第一級オブジェクトと言ったのは>>187だぞ
おまえ他人に頓珍漢なんて言う資格ねえぞ

232:デフォルトの名無しさん
21/06/07 12:28:32.41 5RAm1+EE.net
一昨日の曖昧イキリで今さらヒートアップしてんじゃねー

233:デフォルトの名無しさん
21/06/07 12:36:56.22 0/HU77Xe.net
>187、>190 、>195 、>197、>214
の流れくらい読めよ
禿の権威にかこつけて「第一級オブジェクト」を主張しているのは>>195 >>197だぞ。俺はそれに>>214で反論しているだけで「第一級オブジェクト」は肯定していない。
おまえ他人に頓珍漢なんて言う資格ねえぞ

234:デフォルトの名無しさん
21/06/07 12:44:36.71 OrLbPX6K.net
>>230
おまえの定義では斜め上な返事のことを反論というのか
関数は第一級オブジェクトか否かで揉めてるところへ
禿の定義を参考に持ち出したところへ
権威主義がどうたらと人格批判を始めたのが反論とは笑止千万
だから頓珍漢と言ってやったら相手の言葉をオウム返しし初めやがって
いくら寂しいからってプログラム技術板で全然技術的でない絡み方してんなよ

235:デフォルトの名無しさん
21/06/07 12:48:56.88 x1bKzWtQ.net
流れ一切読んでないけどFirst-class citizenのことを言いたかったのかなw

236:デフォルトの名無しさん
21/06/07 12:49:49.89 RKkN9u5/.net
こいつ「天に唾する」クンでしょ
>>219もコピペでドヤってるし

237:デフォルトの名無しさん
21/06/07 12:51:26.64 OrLbPX6K.net
>>233
失礼な奴だな
オリジナルだよ
コピペじゃねえよ
他で同じもん作ったやつがいたの?
知るかそんなん

238:デフォルトの名無しさん
21/06/07 12:52:10.37 0/HU77Xe.net
>>231
日本語でok

239:デフォルトの名無しさん
21/06/07 13:04:49.21 OrLbPX6K.net
>>235
無教養なやつだな、まあいいけど
犬を相手に話したことが通じてなくても別に構わんのと同じだ

240:デフォルトの名無しさん
21/06/07 14:29:25.71 OrLbPX6K.net
あの程度のコードをコピペだと思ってしまうあたり
自分では書けないやつなんだろうな
だとしたらプログラム技術板では最下層のゴミだ

241:デフォルトの名無しさん
21/06/07 14:43:17.86 Tp4rg2N9.net
効きまくりでクソワロ

242:デフォルトの名無しさん
21/06/07 14:45:04.77 8yb86Hta.net
5hは初めてか?肩の力抜けよ。
「第一級オブジェクト」についてはこんな感じだな。間違っていたら解説してくれ。
・c++では「第一級オブジェクト」は定義されていない
・c++では関数はオブジェクトじゃないし、オブジェクトとして扱うこともできないので、c++の関数をwikipediaにあるような解釈で「第一級オブジェクト」と言うことはできない
・関数を操作対象として(メタ)プログラムする仕組み(テンプレートとか関数オブジェクト・ラムダ式)があるので、高階プログラム自体は可能

243:デフォルトの名無しさん
21/06/07 14:57:20.33 3ylBisjG.net
第一級オブジェクト、よくイキりのWEBプログラム屋が使う印象の単語
C++界隈ではあんまり聞かん単語だな、使わないことはないが

244:デフォルトの名無しさん
21/06/07 15:02:43.23 JV8K97H/.net
std::functionで「第一級オブジェクト」とやらに出来ることは何でも出来るからそれで充分であって
そっから先はただの宗教戦争だろ

245:デフォルトの名無しさん
21/06/07 15:10:41.88 pl6618+T.net
第一級市民オブジェクト
フランス革命で殺されたかも?

246:デフォルトの名無しさん
21/06/07 15:32:32.79 Tp4rg2N9.net
>>241
> std::functionで「第一級オブジェクト」とやらに出来ることは何でも出来る
俺も完全にこれの話だと思ってた

247:デフォルトの名無しさん
21/06/07 15:35:57.19 Tp4rg2N9.net
ただ純粋関数型言語のようには書きたくても書けないよね、というのが>>187-188の話だと

248:デフォルトの名無しさん
21/06/07 15:38:30.60 OrLbPX6K.net
>>238
は? 尻尾巻いて逃げた負け犬の分際で何か言ったか?

249:デフォルトの名無しさん
21/06/07 15:41:28.23 Tp4rg2N9.net
つーか
> 「天に唾する」クン
なのは図星なのかよって思うとまたワロタ

250:デフォルトの名無しさん
21/06/07 16:02:18.11 OrLbPX6K.net
>>246
そんなとこ見てねえよ
コピペ呼ばわりから逃げたいのか?
吐いた唾は飲ませんぞ、自分で書けない低脳が

251:デフォルトの名無しさん
21/06/07 16:40:25.13 8yb86Hta.net
>>241
まあ、c++は歴史が長いから、他人には禁止したい余計な機能はあるよなぁ。
以前、ユーザー側からどうやってもdeleteできないスマートポインタを作ろうとしたけど、どうしても::deleteをブロックできなくて挫折した。……まあ、::delete使うやつはいないだろうけど。
あと、オブジェクトのライフサイクル制限を目的としてヒープに置けない(スタックだけに置ける)クラスを作ろうとしたけど、メンバ変数に置くのをブロックできなくて挫折した。

252:デフォルトの名無しさん
21/06/08 10:43:30.63 x/Of6Ttl.net
そういうしょうもない機能作ることに時間をかけるくらいならバカを雇わない方がよっぽど生産的だわ

253:デフォルトの名無しさん
21/06/08 11:14:53.81 50eCybWC.net
しょうもないかねえ
俺は技術的に色んなことを想像したぞ

254:デフォルトの名無しさん
21/06/08 11:37:14.14 x/Of6Ttl.net
しょうもないわ。
注目するのはなぜdeleteしようとしてんの?ってとこでしょ。
それを無理に禁止してもそいつはもっとめちゃくちゃなことするぞ。

255:デフォルトの名無しさん
21/06/08 11:46:10.34 50eCybWC.net
しょうもないことにしたいやつは考えること自体を拒否するから
相手すんの馬鹿らしいわ

256:デフォルトの名無しさん
21/06/08 14:05:51.36 8EXn3XTK.net
自分も昔似たようなこと考えたことはあったけど
operator->()を実装する限り、直接呼び出しでナマポ取られちゃうのを防ぐ方法がないんだよな
しょうもないことは否定しない

257:デフォルトの名無しさん
21/06/08 14:21:31.17 xX


258:U8pzBk.net



259:デフォルトの名無しさん
21/06/08 14:23:46.24 eGG/8TZ/.net
自分で使う分には全然問題ないんだけどな。他人が絡むとマーフィーの法則が恐ろしい。
パラノイアなのは否定しない。

260:デフォルトの名無しさん
21/06/08 14:55:17.86 RogQNf7Q.net
旅行バッグに荷物をきっちりと�


261:lめてから荷物の入れ忘れに気づく徒労感を楽しみたい人だけやればいい



262:デフォルトの名無しさん
21/06/08 15:32:28.52 50eCybWC.net
ピンプってる場合だってクラックはやればできる
そういうのまで完璧にガードするのか否かで考え方変わってくるからな

263:デフォルトの名無しさん
21/06/09 07:49:45.61 ZYaksnCf.net
標準にだって「禁止」や「非推奨」はあるね

264:デフォルトの名無しさん
21/06/09 18:54:04.56 N9xjQvrw.net
autoでなにか受けるときに、参照を使う方がユニバーサル参照を使うより良い場合ってある?

265:デフォルトの名無しさん
21/06/09 21:30:11.98 QYfnOwKH.net
const参照であればいい場合もあると思う。

266:デフォルトの名無しさん
21/06/09 22:33:15.24 9teK4oYw.net
>>260
ホワァイ?

267:デフォルトの名無しさん
21/06/10 06:52:19.94 Wg8t0Pwp.net
規格票を検索してもuniversal referenceというフレーズはヒットしない

268:デフォルトの名無しさん
21/06/10 07:54:30.31 795Q5O5L.net
もともと名前がなかったので、通称としてuniversal referenceとかforward referenceとか呼ばれるようになったんよ

269:デフォルトの名無しさん
21/06/10 10:15:03.53 p1gVn+om.net
>>262 forwarding reference でどうぞ。

270:デフォルトの名無しさん
21/06/10 14:55:46.69 QNK25992.net
std::vector<A>を、std::vector<B>を使ってソートしたい場合
どうするのがスマートでしょうか?
例えばAが生徒の名前、Bがその生徒の得点だとして・・・
struct C{A a; B b;}を定義してvector<C>を作ってそれの比較演算子を作って・・・というのは思いつきますが
もっといいやり方ってありますかね?

271:デフォルトの名無しさん
21/06/10 15:02:18.84 Wg8t0Pwp.net
名前、得点の他に何か、たとえば出席番号や出席日数などがあるなら
名前と得点だけのstruct C { A a; B b; }; を作るのは得策じゃなさそうだな
全てのデータが載ったマスターデータを作っておいて、
そのレコードへのポインタでvectorなり何なり作ってソートしては?

272:デフォルトの名無しさん
21/06/10 17:03:39.84 PlM5zQeB.net
vector<C>みたいなものを作りたくないならAとBのvectorの要素間の対応関係はどうやって守るつもりなの?
片方だけソートしたら壊れちゃうぞ
元データは触らずにindexのvectorを別に用意して、[](int x, int y){return b[a] < b[y];} でソートする手もあるけど

273:デフォルトの名無しさん
21/06/10 17:04:25.52 RDo2P64U.net
>>260
割となんでか気になるので、よかったら教えてください

274:デフォルトの名無しさん
21/06/10 17:16:00.08 cpOseG3V.net
多次元配列の in-place な添字の入れ替え (transpose) って上手いやり方知られてますか?
多次元配列の各要素は一次元に配置されてると仮定して良いです (行優先でも列優先でも良いです)

275:デフォルトの名無しさん
21/06/10 19:01:36.72 QNK25992.net
>>266-267
ありがとうございます
とりあえず要素そのものじゃなくポインタかインデックスでやれば良いことに気づけました
>>267 >片方だけソートしたら
両方ソートするイメージでした

276:デフォルトの名無しさん
21/06/10 20:38:48.11 Cfq+H/IQ.net
>>269
縦横の二重ループで一つずつswapするしかないんじゃないかなー
gslやgmtlはそうなってた

277:デフォルトの名無しさん
21/06/10 21:10:03.36 cpOseG3V.net
>>271
行列で言うと、上三角あるいは下三角の各要素を巡回して対応する要素と swap するみたいなことですよね?
多次元の場合も同じようにできますかね?
例えば3次元配列だったら、直方体を斜めに切って上三角錐か下三角錐の各要素を巡回するって理解で合ってますでしょうか

278:デフォルトの名無しさん
21/06/11 11:50:48.69 6MS9qCPq.net
CMakeについてもこのスレでいいの?

279:デフォルトの名無しさん
21/06/11 12:12:28.01 lhS8myn8.net
ちょっと違うね
スレないんなら立てたら?

280:デフォルトの名無しさん
21/06/11 15:24:20.00 6w8Pdydz.net
スレ検索したらmakeスレなんて無いんだな
確かにここ10年位makefileなんて書いたことないけど…

281:デフォルトの名無しさん
21/06/11 17:20:45.97 6MS9qCPq.net
VSCodeで書く時は便利なんで・・・

282:デフォルトの名無しさん
21/06/12 18:33:47.62 ghBnzS2R.net
過去に
make 使ったら負け
ってスレがあった

283:デフォルトの名無しさん
21/06/12 18:44:06.98 uNQxUpm0.net
まあ今どきMakefileなんて人間様が書くもんじゃないし

284:
21/06/12 20:02:28.17 bG62sF4n.net
>>278
え?

285:デフォルトの名無しさん
21/06/12 20:28:22.70 uNQxUpm0.net
え?

286:蟻人間
21/06/12 20:35:26.24 bymgAWyc.net
立ててみた。活用してね。
ビルド自動化ツールCMake Part.1
スレリンク(tech板)

287:デフォルトの名無しさん
21/06/12 20:57:53.25 1iQypGIZ.net
cmakeってすごいよね
Makefile作れるだけかと思ってたらVisual Studioのソリューションファイルなんかも生成できて驚いた

288:蟻人間
21/06/12 21:13:38.88 bymgAWyc.net
>>282
CMakeはGitHub Actionsと組み合わせると、ビルドとテストが自動化できて最強なんだよ。
コマンドラインで出来るめんどくさい仕事は自動化してほしいよね。

289:デフォルトの名無しさん
21/06/12 21:40:08.27 sKjH8uh5.net
AutomakeもそううだがCMakeはなんでそんなことができるのか原理がわからん……

290:デフォルトの名無しさん
21/06/12 21:43:46.98 txLE/1e4.net
mesonとかautotoolsとかのビルドツール共用でも良かったかな

291:デフォルトの名無しさん
21/06/12 21:49:00.69 sKjH8uh5.net
ていうかそもそもVisual Studioのslnファイルの仕様とか公式に公開されていましたっけ

292:蟻人間
21/06/12 21:52:27.12 bymgAWyc.net
>>286
中身見てごらん。テキストファイルだよ。

293:デフォルトの名無しさん
21/06/12 22:04:02.95 o9BWFjAs.net
せっかくスレ作ったのにこちらで話してる

294:デフォルトの名無しさん
21/06/12 22:05:38.91 sKjH8uh5.net
>中身見てごらん。テキストファイルだよ。
ヒエッ…、、、ブラックスワン理論…!

295:デフォルトの名無しさん
21/06/12 22:06:14.61 Ap+0oKF5.net
バージョン変わるとすぐ壊れるがな。
dockerで環境揃えてmake使った方がよっぽど安定するわ。

296:デフォルトの名無しさん
21/06/12 22:27:19.91 7X99TIl2.net
>>286
全部のタグを説明するリファレンスのようなものがあるかどうかは知らんけど、ある程度はドキュメント書かれているよ。

297:デフォルトの名無しさん
21/06/12 22:33:32.97 gSM3EPqA.net
>>286
マイクロソフトってそう言うドキュメントは結構まめに公開してるよ
URLリンク(docs.microsoft.com)

298:デフォルトの名無しさん
21/06/12 23:44:11.11 l5AvwX9O.net
M$にベンダーロックインされる。

299:デフォルトの名無しさん
21/06/13 00:08:56.86 nx3q3d7E.net
sln作らなくても最近のVisualStudioは直接cmakeプロジェクト読めるぞ

300:デフォルトの名無しさん
21/06/13 03:39:36.78 8vbdM5AU.net
新しいプロジェクトするならmesonを試したいなー

301:デフォルトの名無しさん
21/06/13 10:14:32.44 exUpBE38.net
GYPには期待したんだがもう先がないな。

302:デフォルトの名無しさん
21/06/13 13:41:01.17 NE9anLMi.net
メンバの構築 (コンストラクタの呼び出し) を後で行いたい
なんでこれしきのことができないんだろうか
「ポインタ使え」はナシね
これしきのことにポインタて笑って感じなんで

303:デフォルトの名無しさん
21/06/13 13:44:02.04 5F9QidAB.net
C++では、デバッグモードと本番モードの切り替えってどうやるのが普通ですか?
今は、実行時に渡す環境変数で切り替えてます

304:デフォルトの名無しさん
21/06/13 14:05:32.61 zIllxi6t.net
ビルド時にバイナリ自体を分けるのが多いような

305:デフォルトの名無しさん
21/06/13 15:41:03.56 NZ4aFVGn.net
>>297
他の言語の多くは参照型がデフォなんだから、同じことをC++でやりたいのなら他の言語の参照型に相当するポインタを使うのは当たり前じゃん。
どうせポインタよく分からないとかスマポも知らずにポインタめんどくさいとか思ってるからポインタ使いたくないんでしょう?このスレで笑われるのは君の方だよ

306:デフォルトの名無しさん
21/06/13 16:45:02.61 MMKkdcax.net
まあスマポが他の言語みたいにスマートでもなんでもないゴミみたいな記述法だからなw

307:はちみつ餃子
21/06/13 17:11:16.17 tRZIM+Qs.net
>>298
デバッグモードというのは具体的に何をするモードのことを言ってるの?
一般的に C++ 関連の用語として言うときのデバッグとリリースの違いはコンパイル時のプロジェクトを分けて
実行バイナリ自体が異なるものになるくのが普通だし、
Visual Studio とかを使ってたらリリース版とデバッグ版はそのように分かれるようになってる。
そういう運用の仕方についての質問ではなく、たとえば
「いざというときに現場でデバッグに使えるモードを仕込んでいるけど
 そのモードへの隠しスイッチはどうあるべき?」
みたいな切り替え方をどうすべきかだけの質問なのかな?
もしそうなら環境変数でもコマンドラインオプションでも自然だと思う。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch