◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

C++相談室 part165 ->画像>1枚


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1698705458/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん (ワッチョイ efda-9b8G)
2023/10/31(火) 07:37:38.52ID:+ZyYyqMO0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part164
http://2chb.net/r/tech/1683600652/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2デフォルトの名無しさん (ワッチョイ 194e-FUJr)
2023/10/31(火) 08:59:52.78ID:DBRUqQAF0
>1 乙です

前スレ 例外はループ脱出に使うような物じゃない、との意見に賛成です。

自分は、例外は「起こり得るけどいちいちエラー処理を書いたらアホな話を」「処理呼び出し毎ではないレベルで」「エラー対処コーディングするもの」と思ってます。

具体例は、
リンクリストなどコレクション操作でメモリ不足が起きた場合、のエラー処理。
コレクションの追加や削除を頻繁に行うコードって、大体はもっと概念レベルが高い事をやってるので、1件の追加 レベルでエラー処理書いてたらアホな感じになる。

しかも、GUI プロセスを作ってて何か上手く動かないから特定のエラーだけを画面に表示したい、など、ことさら明確に対処したい場合です。プロセスが落ちればいいだけなら、main()の外側、の仕様がやってくれる。


古い本の情報だけど、SBリップマンによると、MS VC++と、sun、hp-ux の C++コンパイラで、例外を使う/使わないで速度性能調査したそうで、 4~6% の速度劣化があったとの事です。
3デフォルトの名無しさん (ワッチョイ 6105-NMSe)
2023/10/31(火) 09:37:52.87ID:BnGGo/620
スレ終了間際に現れる質問いいですかオジなんなの?w.
4デフォルトの名無しさん (スププ Sd33-wFsA)
2023/10/31(火) 09:38:43.79ID:yneNhI3/d
Pythonで言うと
forのStopIterationは へっ? だし
int()のValueErrorですら微妙
5デフォルトの名無しさん (ワッチョイ 5397-ggTH)
2023/10/31(火) 11:32:52.74ID:5ddE/sJo0
うるせえstd::stoi()ぶつけんぞ
6デフォルトの名無しさん (アウアウウー Sad5-U1R4)
2023/10/31(火) 16:49:04.12ID:Xd7Dooyma
>>3
ヘッダーの最後の行の #endif みたいなものだよ
7デフォルトの名無しさん (ワッチョイ 6105-NMSe)
2023/10/31(火) 23:53:09.44ID:BnGGo/620
>>6
と、言うことは対になる#ifがどこかに?
8デフォルトの名無しさん (ワッチョイ 1945-FUJr)
2023/11/01(水) 10:50:51.42ID:NLQyML8a0
…(いくら5chとは言え、複数の人が集まる場所で、何かを教えて頂いてもお礼も言えず、面白い返しもできない人がいたとして。その人がプログラムに関してだけは素晴らしいコードを書ける、なんてことはあるのかな?と思う瞬間が人生の中であったり、なかったり)
9デフォルトの名無しさん (ワッチョイ 297c-tLJy)
2023/11/01(水) 12:51:50.53ID:h0xHi7n60
(礼儀とプログラミングスキルは関係ないと思う)
10デフォルトの名無しさん (ワッチョイ 13ad-feYx)
2023/11/01(水) 12:53:02.45ID:c3s+uM8y0
(俺の昼飯どこ行った?)
11デフォルトの名無しさん (アウアウウー Sad5-U1R4)
2023/11/01(水) 16:02:16.42ID:G1jsC9Xya
(今日の昼飯はセブンのサバ塩焼弁当にしとくか・・・)
12デフォルトの名無しさん (ワッチョイ 1939-PupP)
2023/11/01(水) 18:24:49.00ID:m9AntJVX0
コードにはある程度そいつの人間性は反映されるな
スレチな話題ではあるけど
13デフォルトの名無しさん (ワッチョイ b1f8-XCYI)
2023/11/01(水) 23:07:31.46ID:PfaqlzcX0
(本物のプログラマはPascalを使わない)
14デフォルトの名無しさん (ワッチョイ 6105-NMSe)
2023/11/01(水) 23:30:59.94ID:ZqfN6pKA0
(でもPythonは使ってもいいのかな?って時々思う)
15デフォルトの名無しさん (オイコラミネオ MM6d-H9h+)
2023/11/02(木) 00:03:32.45ID:aqkFofyNM
そろそろキャストは止めてスマポ使いましょう
16デフォルトの名無しさん (ワッチョイ d94e-vgKx)
2023/11/02(木) 02:43:15.24ID:+4XO/JeH0
まちゅまちゅの3Dライブみた
前も思ったけどみこちとかなたそのダンス、めっちゃシンクロ率高い
リズムがぴったり一緒なんだよね
ダンスほんとにうまくなったよな
17デフォルトの名無しさん (ワッチョイ d94e-vgKx)
2023/11/02(木) 02:43:45.89ID:+4XO/JeH0
誤爆った(´・ω・`)
18デフォルトの名無しさん (ワッチョイ 1bda-9b8G)
2023/11/02(木) 07:17:03.35ID:Hn8AmdCQ0
ホロライブか
19デフォルトの名無しさん (アウアウウー Sad5-U1R4)
2023/11/02(木) 10:44:27.02ID:BqsrFUCWa
(まちゅまちゅの3Dライブ?・・・ちょっと気になる)
20デフォルトの名無しさん (ワッチョイ 6105-NMSe)
2023/11/02(木) 23:48:48.29ID:ebj85xCu0
(((お前ら括弧ばっかり使ってlisperかよ?)))
21デフォルトの名無しさん (ワッチョイ a905-fLgT)
2023/11/03(金) 10:21:23.72ID:sUQ44pbr0
←vーー( ゚∀゚)!ー^ー
22デフォルトの名無しさん (ワッチョイ 6276-0SSA)
2023/11/04(土) 18:56:36.20ID:Y/q1DSa/0
コピーとムーブの挙動、というか管理難しい。。難しくない?
23はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0979-oDOv)
2023/11/04(土) 20:24:08.34ID:1CTu6tq50
コピーやムーブはパターンに沿って管理できるからそんなに難しいとは感じないな。

ワイとしては参照の畳み込み (Reference collapsing) や変換の規則を毎回のように確認するんだけど全然頭に入ってこない。
参照はオブジェクトではないので逆に言えば値に対応する型が参照になることはないのだが、それはそれとして参照を含む型があり得るというのが今でも腑に落ちない。
24デフォルトの名無しさん (ワントンキン MM92-JcAe)
2023/11/04(土) 20:28:09.97ID:KOZ2F//lM
参照しか知らんものだけど、ムーブて何か簡単に教えて
参照は実装上ただのポインタじゃん
ムーブはなにがどうなるん?
25はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0979-oDOv)
2023/11/04(土) 20:29:19.85ID:1CTu6tq50
ムーブコンストラクタが起動する。
それだけ。
26デフォルトの名無しさん (ワッチョイ 658d-qcxi)
2023/11/05(日) 09:49:50.04ID:6vgG9vCb0
>>24
考え方としては、shallow copyを二重開放リスクを避けて行うための仕組み。
右辺値という特別な一時変数のコピーで特別なコピー(ムーブコンストラクタ)を実行するようにして、クラス設計者が必要に応じてshallow copyを実装しやすくしている。
27デフォルトの名無しさん (アウアウウー Saa5-CWlg)
2023/11/05(日) 10:41:04.16ID:ol9bMVcca
>>24
moveはRustで言う所有権の移動じゃないか
28デフォルトの名無しさん (ワッチョイ 454e-0SSA)
2023/11/05(日) 13:06:56.97ID:Qkn7cpbH0
>>24
aに戻り値などの一時オブジェクトbをコピーすると通常は

aでメモリを確保
bからメモリコピー
bのデストラクタでメモリを破棄

という動作になるけど、moveの場合

aにbでメモリをポインタで持ってくる
bのインスタンスでは破棄したことにする

とすれば無駄なメモリ確保とコピーが発生せず効率が良い
29はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-9NWm)
2023/11/05(日) 13:39:42.02ID:pHGS9osC0
標準ライブラリでのムーブは所有権 (ownership) の概念を前提として構築されているし、
慣例としてもそのようにするものではあるんだが
言語としてはムーブコンストラクタ (またはムーブ代入演算子) を呼び出すというだけで
所有権の面倒をみる機能は何もない。
(辻褄が合うようにするのはプログラマの責任。)
何が起きているのかは所有権の概念と実装レベルで分けて考えたほうがいいと思う。

どう説明していいかわからんから関連する要素を箇条書きにしたらこんな感じかな。

・ それがコピーの文脈であるかムーブの文脈であるか区別は出来る
・ 一般的にムーブの文脈であった場合 (寿命が尽きる直前の一時オブジェクトの再利用が出来る場合) にコピーより効率が良い動作が出来る可能性がある
・ どのように効率がよくなるのかはそのクラス (のムーブコンストラクタやムーブ代入演算子) の定義次第
・ 典型的なムーブの実装はリソース本体を指すポインタの交換によって実現される
・ ユーザーが定義を与えなかった場合のデフォルトのムーブは全てのサブオブジェクトをムーブすることになっている
30デフォルトの名無しさん (ワッチョイ 454e-0SSA)
2023/11/05(日) 13:42:20.39ID:Qkn7cpbH0
で、このmove動作を定義するために、
一時オブジェクト(右辺値)に対する参照動作を関数定義できるようになっている
31デフォルトの名無しさん (ワントンキン MM92-JcAe)
2023/11/05(日) 14:05:22.83ID:wAmDr/fyM
ムーブされるとそのポインタは変わってしまうと思うけど、そういうケースはないの?
32デフォルトの名無しさん (ワッチョイ 454e-0SSA)
2023/11/05(日) 14:18:09.07ID:Qkn7cpbH0
言っている意味がよく分からないが、純粋なポインタにはムーブという概念はないよ
ムーブを定義できるのはクラスに対してだけ
他の人も言っているようにムーブといっても実体は単なる関数呼び出しなので、その中でプログラマが自分の責任で必要なコードを書くことになる
33デフォルトの名無しさん (ワッチョイ 653d-2MVi)
2023/11/05(日) 14:58:05.35ID:vIwIC4VV0
質問した人じゃないけど説明ありがたいです

ムーブ難しいと思ってたけどもっと早く勉強して仕事で使うべきだった

(文法解析した要素をポインタいじって並べ変えるんだけど…
二重所有を防ぐのを手作業コーディングで責任を持たなければならないプログラムを作ってしまった)
34デフォルトの名無しさん (ワッチョイ 454e-0SSA)
2023/11/05(日) 15:15:28.75ID:Qkn7cpbH0
ただ、右辺値参照を使うと、通常の参照や代入と使い分けるためにconstやnoexceptを厳密に指定しないといけなくなりがちだから、
その辺の総合的な理解が必要になってくるのは注意点だね
constは一度付け始めるとライブラリ全部に伝染するからな・・・それを嫌って使わない派も結構いる(いた)よね
35デフォルトの名無しさん (ワッチョイ ed7c-9LC0)
2023/11/05(日) 15:39:17.77ID:Vx5ySS520
実際のコードだとポインタのムーブはunique_ptrとかにぶん投げで、自分で移動コード書くことはまずないな
自分でムーブ特殊関数の中身書くのはハンドル的なもののムーブを実現したいときくらい
36デフォルトの名無しさん (アウアウウー Saa5-3l7D)
2023/11/05(日) 16:12:35.07ID:jiV3XvQ2a
とにかく unique_ptr が便利すぎるから何でもかんでも全部 unique_ptr 使うようになってしまった
まあそれでいいのかもしれないが
37デフォルトの名無しさん (アウアウウー Saa5-CWlg)
2023/11/05(日) 16:21:29.02ID:ol9bMVcca
>>33
銀の弾丸ではない
手作業コーディングで責任を持たなければならないのは変わらない
38はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-9NWm)
2023/11/05(日) 17:10:59.04ID:pHGS9osC0
所有権管理も結局はプログラマが書く (間違いを部分的にコンパイルエラーとして検出できることはある)、
所有権って具体的に何なんだってのはクラス定義に押し込めるという風に管理のレイヤを分けることが出来るってわけ。

クラス定義をした後は具体的に何をやってるのかを忘れて
所有権というものだと思い込むことが出来るという抽象化の仕組み。
39デフォルトの名無しさん (ワッチョイ 6540-pUwU)
2023/11/07(火) 10:10:32.04ID:5c9945xO0
>>37
アホか
普通に考えて、そのコード(クラス)の利用者が所有権について明示的に何かしなきゃいけなかったということだろ
40デフォルトの名無しさん (ワッチョイ 653a-qcxi)
2023/11/07(火) 19:02:58.77ID:Z7KocuHY0
>>33
エスパーするけど多分その用途だとmoveは使えない。

データを共有している感じなので素直にshared ptrを使うのがいいかと。shared ptrで性能的にキツイならshared ptrを参照渡しするか。
41デフォルトの名無しさん (ワッチョイ 653a-qcxi)
2023/11/07(火) 19:09:56.10ID:Z7KocuHY0
>>40
ちょっと補足すると、戻り値をshared ptrの参照にするのはNGですな。そこは素直にRVOに期待するのが良いか。
42デフォルトの名無しさん (ワッチョイ e5a7-cSrA)
2023/11/09(木) 17:23:48.54ID:Op1F6lz40
VC++なんだけど32bitで_thiscallを関数ポインタ経由で呼ぶことってasm使わないと不可能?
メンバ関数を関数ポインタ変数とすることは出来てもそこから第一引数にインスタンス入れたりしてもコンパイル時エラーになる
43デフォルトの名無しさん (ワッチョイ 454e-0SSA)
2023/11/09(木) 18:09:02.18ID:vDu6brxv0
>>42
メンバ関数をポインタ経由で呼び出したいってことならstd::bindでできるはず
44はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-9NWm)
2023/11/09(木) 18:24:20.63ID:viBVvDAP0
VC++ のことは知らんけどメンバ関数ポインタは関数ポインタより大きい実装になってる処理系がある。
メンバ関数ポインタを関数ポインタに変換した時点で呼び出すのに必要な情報が失われているかもしれない。
45デフォルトの名無しさん (ブーイモ MM62-wwCg)
2023/11/09(木) 19:04:30.42ID:YhbH7ApDM
MJD?
46デフォルトの名無しさん (オイコラミネオ MM49-wdyj)
2023/11/09(木) 19:13:19.18ID:RZ9WOZDMM
エラーメッセージにヒントはない?
47はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 097f-Nt8Z)
2023/11/09(木) 19:58:26.06ID:u3KRHVuW0
基本的には言語の規定内でやるに越したことはないので無理な型変換をしないで済ませられるように出来るものならそうしたほうがいい。
どうしてもそうできない事情がある(と質問者が認識している)ならもうちょっと詳しい状況をコードで示して欲しい。
48デフォルトの名無しさん (ワッチョイ e5a7-cSrA)
2023/11/09(木) 21:12:03.97ID:Op1F6lz40
>>43
ありがとう、逆アセ見たら完璧にthiscallになってた

メンバ関数っていうかthiscall指定したものは32bitだとecxレジスタにthisポインタが隠されていてそれ以外はstdcallと同じ
なので下みたいに第一引数にインスタンスのポインタを入れる事でecxに代入される感じになりそうだなーと思ったら無理だった
ちなみに64bitの場合はどちらもfastcallで同じだから単純に第一引数にthisポインタが隠されてるだけ
auto pFunc = CDate::addDay; // CDate addDay(int value)
CDate tomorrow = pFunc(&instance, 1);
49デフォルトの名無しさん (ワッチョイ e5a7-cSrA)
2023/11/09(木) 21:28:58.67ID:Op1F6lz40
てかググったら簡単なシミュレーション方法載せてるブログあった
_fastcallで宣言して第二引数のedxを捨て駒にする事で疑似_thiscallになる
つまりint(__fastcall * pFunc)(CDate*, void*, int)とすれば一応アセンブラ的な辻褄は合う事になる
50デフォルトの名無しさん (ワッチョイ 1f63-1OcW)
2023/11/12(日) 10:07:59.74ID:j2Y95IYf0
質問なのですが型Tの参照を返す関数 const T& foo() の戻り値をautoのいくつかのバリエーションで受けてアドレスを見て見たのですが
  auto x = foo();
  auto& y = foo();
  const auto z = foo();
  const auto& zz = foo();
  const volatile auto& zzz = foo();
  cout << "&original=" << &g_vec << endl;   // &original = 00B013D8 (このアドレスは一例)
  cout << "&x=" << &x << endl;        // &x = 010FF8AC // コピー(意図しないかも?)
  cout << "&y=" << &y << endl;        // &y = 00B013D8 // 参照(OK)
  cout << "&z=" << &z << endl;        // &z = 010FF888 // コピー(意図しないかも?)
  cout << "&zz=" << &zz << endl;       // &zz = 00B013D8 // 参照(OK)
  cout << "&zzz=" << &zzz << endl;      // &zzz = 1 // !!!!
という行末コメントに記載の結果になったお
Q1. 参照で受けたい場合は auto でなく auto& とせねばならない、で正しい?
Q2. 間違えてauto で受けても動いてしまい発見し難いケースが多いと思うのですが
  意図しないパフォーマンス低下になるので防ぐ対策とか無い?
Q3. zzzのアドレスが1になるのは一体……
MSVC2019使用、言語の設定はC++14、
51はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-zQu6)
2023/11/12(日) 11:02:37.63ID:O0gb6uIB0
>>50
A1. 単に auto としたときに参照になることはない。
  参照として受け取りたい場合は auto& にせねばならないというのは正しい。
A2. 参照かどうかで自動的に場合分けして欲しいなら decltype(auto) とすればいいが……
  参照で受けるのが正しい状況なのかどうかは状況による。
  テンプレート内など自動的な場合分けが必要な場合を除いては参照は参照として明示したほうがよくない?
  (個人的感想です。)
A3. いくつか用意されている operator<< の基本的なオーバーロードの内で bool にマッチするから。
  void* もあるのだけれど C++ では任意のポインタは void* へは暗黙の型変換されないのでマッチング候補にならない。
  アドレスとして解釈して欲しいなら void* へ明示的に型変換しないといけない。
52はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-zQu6)
2023/11/12(日) 11:38:27.18ID:O0gb6uIB0
ごめん。 間違いがあった。
ポインタは void* へ暗黙に変換できる。
この変換はオーバーロード解決時の候補になりうる。
ただ、 bool への変換とは優先順位に差がある。
53デフォルトの名無しさん (ワッチョイ 1f63-1OcW)
2023/11/12(日) 11:42:25.19ID:j2Y95IYf0
>>51>>52
㌧クス、
なるほど
わかりた
↓こうなったわ
  decltype(auto) z = foo();
  const auto& zz = foo();
  const volatile auto& zzz = foo();
  cout << "&original=" << (void*)&g_vec << endl;   // &original=010213D8 (このアドレスは一例)
  cout << "&z=" << (void*)&z << endl;         // &z=010213D8   // 参照(OK)
  cout << "&zz=" << (void*)&zz << endl;        // &zz=010213D8   // 参照(OK)
  cout << "&zzz=" << (void*)&zzz << endl;       // &zzz=010213D8  // 参照(OK)
  cout << std::boolalpha << "&zzz=" << &zzz << endl; // &zzz=true    // boolean
boolへの変換は使うことは無いと思うが正体は調べてみるわ
54デフォルトの名無しさん (ワッチョイ 1f63-1OcW)
2023/11/12(日) 11:46:29.61ID:j2Y95IYf0
>テンプレート内など自動的な場合分けが必要な場合を除いては参照は参照として明示したほうがよくない?
非constなら考えるがこの場合foo()はconstオヌジェクトと参照を返してくるし、
これはもうdecltype(auto)一択で良いような気がが、
55はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-zQu6)
2023/11/12(日) 12:07:32.76ID:O0gb6uIB0
volatile を追加する変換は出来るが除く変換は出来ないから
volatile 付きのオーバーロードを用意していない operator<< では候補から消えて
bool だけが候補として残ってしまうってことになるみたいだな。

volatile が付いていない場合は
void* への変換のほうが bool への変換より優先順位が高いので
そっちが呼ばれる。
56あぼーん
NGNG
あぼーん
57デフォルトの名無しさん (ワッチョイ 7fb1-qIOU)
2023/11/13(月) 02:33:43.38ID:eLF59GiN0
>>56
案内サンクス
58デフォルトの名無しさん (ワッチョイ 1f01-XI6K)
2023/11/14(火) 02:19:13.60ID:DkCdWP9x0
CLion使ってる人いますか?
59デフォルトの名無しさん (ワッチョイ 1fad-XI6K)
2023/11/17(金) 17:16:02.48ID:TT3SJP5h0
日本人の死亡者が増えてるのに、メディアは報道規制
http://2chb.net/r/cafe50/1699777256/l50
60デフォルトの名無しさん (ワッチョイ 6ecf-ekUX)
2023/11/18(土) 16:16:09.27ID:5MckQHFy0
ラムダの参照キャプチャってconst参照に指定できないんだっけ?微妙に不便だな。
61デフォルトの名無しさん (ワッチョイ 7901-4XBo)
2023/11/18(土) 20:47:45.62ID:GRi2RJZB0
>>60
これじゃだめ?
#include <iostream>
using namespace std;
int main () {
const int a {0};
int b {0};
[&a, &b = const_cast <const int &> (b)] () {
++ a; // X
++ b; // X
} ();
return 0;
}
62デフォルトの名無しさん (ワッチョイ 4701-1fOb)
2023/11/26(日) 06:27:21.37ID:DSb557XU0
C++20 RangesはMicrosoftの説明がわかりやすかった
63デフォルトの名無しさん (ワッチョイ 791f-q5uF)
2023/12/05(火) 10:33:06.64ID:HLoKrA0o0
ふと今更思ったんだけど
ポインターpに対して演算子*が返す*pは、
値じゃなくて参照?
64デフォルトの名無しさん (ワッチョイ b501-sZSb)
2023/12/05(火) 11:05:15.15ID:E3GJtsiR0
#include <type_traits>
#include <iostream>
using namespace std;
int main () {
int value {0};
int *p {&value};
cout << is_reference <int>::value << '\n';
cout << is_reference <int &>::value << '\n';
cout << is_reference <decltype (value)>::value << '\n';
cout << is_reference <decltype (*p)>::value << '\n';
return 0;
}
65デフォルトの名無しさん (ワッチョイ edf6-JrwL)
2023/12/05(火) 11:09:19.91ID:IVr4NrBA0
>>63
参照ってのが何を意味しているか分からんが
普通はポインターの示す場所の内容だ
66はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
2023/12/05(火) 11:22:18.93ID:z5PiblaY0
>>63
ポインター p に対して *p とした場合の型は参照ではない。
たぶん >>64 は *p が参照と言いたいつもりで書いているんだと思うけど
decltype に与えられる式の型が T 型の lvalue だった場合には T& が返されるルールなので
その式が参照でなくても参照が返されることがある。
67はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
2023/12/05(火) 11:24:42.01ID:z5PiblaY0
あ、ごめん。 完全に間違った説明してたわ。 忘れて……。 恥ずかしい。
68はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
2023/12/05(火) 11:34:00.06ID:z5PiblaY0
と思ってよく仕様を読んでみたらやっぱりこの (>>66) 考え方で正しいはず。

式が識別子式の時に限っては decltype は参照にならず式の型そのままで返すせいで decltype(value) は参照にならないが、
value と *p は型システム的にも値カテゴリ的にも同じだわ。
69デフォルトの名無しさん (ワッチョイ b501-sZSb)
2023/12/05(火) 12:43:28.97ID:E3GJtsiR0
>>68
なるほどー! 横からだが勉強になった
70デフォルトの名無しさん (ワッチョイ b501-sZSb)
2023/12/05(火) 12:48:03.77ID:E3GJtsiR0
巷のスマートポインタはoperator*で参照型を返すので
生ポインタも同じかと思ってたよ
71はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03)
2023/12/05(火) 13:28:25.92ID:z5PiblaY0
互換性の都合とかがあるから仕方ないね。
場合分けが大量にあって単純な一般原則の組み合わせにはなってないから仕様を読み解くのがしんどい……
72デフォルトの名無しさん (ワッチョイ 9f1f-oseA)
2023/12/11(月) 15:17:51.77ID:7vxydTfj0
ある構造体Aがあります
Aの比較関数が複数ありますcompA0,compA1,compA2,...
比較関数の関数ポインタがありますcompA
compA = &compA2;

別の構造体Bがあります
BはAを内包しています
struct B{ A a; ... };
この構造体Bを、Aの比較関数ポインタcompAで比較してソートするにはどう記述すればよいですか?
std::vector<B> bs;
bs.push_back(...);...
std::sort(bs.begin(),bs.end(),?);

できればラムダ式を使わずにできるとありがたいです
73デフォルトの名無しさん (ブーイモ MM5b-oUR/)
2023/12/11(月) 15:22:02.06ID:F1R6HyeLM
>>72
ラムダ式使った方が良いと思うけど本当にラムダ式なしが良い?
74デフォルトの名無しさん (ワッチョイ 9f1f-oseA)
2023/12/11(月) 15:29:19.94ID:7vxydTfj0
使われると、ラムダ式の質問をすることになると思います・・・
75はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-pD6R)
2023/12/11(月) 15:45:20.57ID:wAhsIAfi0
>>72
もし C++20 を使えるなら (std::sort と違って) std::ranges::sort では比較関数とは別に
比較すべき要素を取り出す操作をプロジェクションとして与えることが出来るから
これ一発でいけてだいぶん楽できる。

std::ranges::sort(bs, compA, &B::a);
76デフォルトの名無しさん (ワッチョイ d701-Qbcu)
2023/12/11(月) 16:01:10.52ID:dil4ai7q0
>>75
すげ! 今そんなのあるんやね
77デフォルトの名無しさん (ワッチョイ d701-Qbcu)
2023/12/11(月) 16:34:20.59ID:dil4ai7q0
>>74
思い出すのがしんどくなってきた
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct A {int value_;};
bool compA2 (const A &lhs, const A &rhs) {
return lhs.value_ < rhs.value_;
}
struct B {A a;};
int main () {
vector <B> bs;
bool (*compA) (const A &, const A &) {compA2};
sort (bs.begin(), bs.end(), bind (compA, bind (mem_fn (&B::a), placeholders::_1), bind (mem_fn (&B::a), placeholders::_2)));
sort (bs.begin(), bs.end(), [compA] (const auto &lhs, const auto &rhs) {return (*compA) (lhs.a, rhs.a);});
return 0;
}
78デフォルトの名無しさん (ワッチョイ 771f-oseA)
2023/12/11(月) 17:14:54.00ID:cVrrslE50
>>75
>>77
お二方、ありがとうございます
参考にして組んでみます
79はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-pD6R)
2023/12/11(月) 17:25:04.51ID:wAhsIAfi0
その場で合成するのはさすがに見通しが悪すぎるので、
C++11 頃の C++ を仮定して私がやるならまずアダプタを作ると思う。
ちょっと雑ですまんがとりあえずこんな感じ。

class compB_adaptor {
private:
using comparator = std::function<bool(const A&, const A&)>;
comparator compA;

public:
compB_adaptor(comparator comp) : compA(comp) {}
bool operator()(const B& x, const B& y) {
return compA(x.a, y.a);
}
};

使うときには間にひとつ挟むだけで済む。

std::sort(bs.begin(), bs.end(), compB_adaptor(compA));
80デフォルトの名無しさん (ワッチョイ 771f-oseA)
2023/12/11(月) 22:08:32.24ID:cVrrslE50
>>79
求めていたものそのものであったため、採用させていただきました
ありがとうございます
81デフォルトの名無しさん (ワッチョイ 1663-4if3)
2023/12/20(水) 23:47:12.14ID:tqHuIeXr0
int x;
std::cout << x;
でxが正ののときは「+」符号を付けさせるのってどうするんでしたっけ……
cout.form("%+d", x)とか以外で
82デフォルトの名無しさん (ワッチョイ 2701-NGr8)
2023/12/20(水) 23:58:48.32ID:Qfvbx0VO0
cout << showpos
83デフォルトの名無しさん (ワッチョイ 1663-4if3)
2023/12/21(木) 08:41:44.38ID:6wjPSKlj0
てきました㌧クス、
iosヘッダで探せば良かったのか、、、
84デフォルトの名無しさん (ワッチョイ 63d2-XEY5)
2023/12/21(木) 20:01:46.13ID:i16TeC3D0
C++23だとこれ
std::print("{:+}", x);
85デフォルトの名無しさん (ワッチョイ 4ba7-JRUi)
2023/12/22(金) 13:56:54.85ID:pQLEje080
PythonやC#のようなf"{x}"構文が作られる事はないんだろうか
86はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d23e-E09z)
2023/12/22(金) 14:54:27.15ID:gr/vrzoo0
>>85
リフレクションが充実すればその上に実装できるので
直接的な言語機能として用意すると
辻褄合わせが後で面倒になるだろうし、
現時点で考えるのは時期尚早だと思う。
87デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/24(日) 17:42:14.24ID:foDTiHm90
質問なのですが自作クラスFooのストリーム出力演算子に引数付きのマニピュレータを追加したいのですが
  ↓こんなやつ
  Foo obj;
  cout << custom_setw(10) << obj; // 整数のベクトル的なオブジェクトobjの要素を幅10文字で出力
custom_setw()で与えた10という数値をつつがなくFooのストリーム出力演算子
std::ostream& operator<<(std::ostream& os, const Foo& obj)
に渡すには一体どうすれば……orz
88デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/24(日) 17:42:52.36ID:foDTiHm90
グローバル変数渡しは最初に思いつくのですが、ostringstream os1, os2とFoo obj1, obj2に対して異なるスレッドで
os1 << custom_setw(30) << obj1;  // スレッド1
os2 << custom_setw(20) << obj2;  // スレッド2
とかやったら詰むし
std::setw()とか一体どうやってるんじゃ……
89はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-XnzH)
2023/12/24(日) 18:05:55.09ID:SfA3xmSz0
>>87-88
特定の型を出力するときにだけ作用する書式を設定するマニピュレータってこと?

std::setw がやってるのはストリームのメンバ関数 width を呼ぶのと同じ。
ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。

もちろんあなたが定義した独自の型 (この例では Foo) に結び付いた書式を保持するところなんて存在しないから単純にはできない。
私が思いつくのは
 ・ ストリームのほうも新しいものを定義する、つまり basic_ostream を継承して Foo 用の書式を格納するデータメンバを増やす
 ・ ストリームに対応付いたデータを格納するものを std::map かなんかで保持しておいて Foo を出力するときはそれを参照する
ということくらいかな。

スレッドが絡むと面倒くさいけど、しょうがないね。
90デフォルトの名無しさん (ワッチョイ 337c-dsFJ)
2023/12/24(日) 19:04:41.48ID:vbUOIudY0
既存のcoutとかstringstreamとかで使いたいなら、グローバルのstd::unordered_map<std::ios_base*, MyManipData>にでも置いとくしかないだろうね
ストリームオブジェクトの状態で持たせるクソ設計が悪いんだ
91デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/24(日) 19:34:37.93ID:foDTiHm90
レス㌧クス、
>ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。
なるほど……
これはユザーの立場からはメンバの追加ができない領域なので、Fooの側にメンバを持たせることにしますか……
class FooWrp {
  const Foo& m_objRef;
  int m_nWidth;
public:
  FooWrp(const Foo& obj, int width) : m_objRef(obj), m_nWidh(width) { }
  friend std::ostream& operator<<(std::ostream& os, const FooWrp& wrp) { ...(wrp.m_objRefの要素をwrp.m_nWidthに描かれている幅で出力する処理)... }
};
92デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/24(日) 19:35:17.01ID:foDTiHm90
// 使い方
Foo obj;
cout << FooWrp(obj, 10);

ダッサwwwwwwwwwwwwwwwwwww
しかし、「たかが表示の整形」のために排他制御しつつmapを弄ったりTLSの利用を考えるのもアレなのでこれはこれで仕方が無いのか、orz
93デフォルトの名無しさん (ワッチョイ a31e-H80b)
2023/12/24(日) 19:45:29.51ID:Y8qSN/i/0
ストリーム用の演算子なんか作らずに
オブジェクトの文字列表現を返す関数を用意したほうが汎用性高くない?
94デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/24(日) 19:50:06.00ID:foDTiHm90
Foo obj;
std::string s = obj.str(10); // 10億ギガ文字
cout << s;
出力を完遂できるんかこれ……
95はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-XnzH)
2023/12/24(日) 20:00:55.29ID:SfA3xmSz0
C++20 からは std::formatter を特殊化して書式指定を解釈するコードを入れておけば
std::format で独自の型を表示しようとしたときにその特殊化が使われる仕組みになってる。
96デフォルトの名無しさん (ワッチョイ a31e-H80b)
2023/12/24(日) 21:41:50.00ID:Y8qSN/i/0
オブジェクトの文字列表現が10億ギガ文字もあるの!?
FooWrpオブジェクトをうっかりログに出力しちゃったら大変だね!!
97デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/29(金) 19:34:46.18ID:MPSeCS+O0
実験せずに質問するますが、
int a, b;
cin >> &x >> &y;
に対し、
Q1. 「100 a」を入力したら例外もタイムアウト待ちも発生せず、cin.fail()がtrueになるだけ?
Q2. 「100」とだけ入力してそのまんま(リダイレクト元のファイルハンドルか何かが
  タイムアウトもエラーもクローズもしなければ)ならそれっきり返ってこない?
98デフォルトの名無しさん (ワッチョイ cf63-nyJS)
2023/12/29(金) 19:40:39.84ID:MPSeCS+O0
EOFが抜けてたorz
Q2のケースにおいて「100 [EOF]」なら(多分)cin.fail()でとりあえずすぐ返ってくるのかそうか、
99はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-XnzH)
2023/12/29(金) 21:37:06.10ID:0cvltfsQ0
>>97
実にしょうもない確認なんだけど、
言いたいことは

int x, y;
cin >> x >> y;

でよいんだよね?
100デフォルトの名無しさん (ワッチョイ de63-J7+h)
2023/12/30(土) 05:42:41.89ID:3ksfrMrT0
>>99
>int x, y;
>cin >> x >> y;
おk
スマンカッタorz

エラーとEOFのどちらかを検知したかったら!cin.good()が正しいっぽい?
https://blog.emattsan.org/entry/20110819/1313743195

ここまでは分かった気がするが、
ストリーム入力演算子std::istream& operator>>(std::istream& os, Foo& obj)の中で入力に失敗した場合
どうやってエラーを呼び出し元に通知したらええんじゃ……
101デフォルトの名無しさん (ワッチョイ de63-J7+h)
2023/12/30(土) 05:50:37.02ID:3ksfrMrT0
クラスFooの入力ストリーム演算子の中で整数を2個読むとして、
std::istream& operator>>(std::istream& os, Foo& obj) {
 int x, y;
 os >> x >> y;
 if (!os.goot()) {
  return os; // エラー発生時は単純にreturn os; でおk?
 }
 obj.m_x = x;
 obj.m_y = y;
 return os;
}
102はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 43c3-KM86)
2023/12/30(土) 08:47:16.28ID:XV37Te4m0
>>100
ストリームのフラグを立てるメンバ関数は setstate だけど
>>101 の状況ならフラグはもう立ってるから戻るだけで問題ないよ。
103デフォルトの名無しさん (ワッチョイ de63-J7+h)
2023/12/30(土) 13:48:41.88ID:3ksfrMrT0
わかりた
ていうかエラー判定(eofbit以外のビットのセットを判定)なら!os.good()や!os.goot()ではなくて
os.failed()か!osですたね……orz
これらに関して追加の質問が出たら初心者スレに書くわサーセン;;;
104デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2023/12/31(日) 20:09:05.68ID:tpduSr4A0
class A{

char buf_[size];
}

このbuf_に任意のオブジェクトをplacement newして使用するのだけど
このオブジェクトをコピーしたりムーブする場合、単純にコピー元のbuf_からコピー先のbuf_にmemcopyしてしまって大丈夫ですか?
105デフォルトの名無しさん (ワッチョイ 06a2-M+UX)
2023/12/31(日) 20:44:02.18ID:bvEcnWMM0
全く大丈夫じゃない
初心者スレからどうぞ
106デフォルトの名無しさん (ワッチョイ 8101-KEYj)
2023/12/31(日) 20:54:11.90ID:NNsdlVTY0
構造体から派生させれば出来るよ
107デフォルトの名無しさん (ワッチョイ 06a2-M+UX)
2023/12/31(日) 21:04:16.47ID:bvEcnWMM0
せめてPODと言おう
初心者スレからどうぞ
108はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0904-OTTg)
2024/01/01(月) 00:18:02.48ID:6hyMwo3D0
POD は削除された。
trivially copyable の要件を満たすならその型は memcpy でコピーしてもよい。
std::is_trivially_copyable で判定できるのでどこかに制約を入れておけば安心かもね。
109デフォルトの名無しさん (ワッチョイ 656a-R/a6)
2024/01/01(月) 00:36:03.09ID:an53Mx2V0
削除されたんですか?(バージョンいくつで?)

c++20 で非推奨になった、てのはすぐ調べられたんだけどその先が分からんです
110はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0904-OTTg)
2024/01/01(月) 00:46:07.42ID:6hyMwo3D0
>>109
規格の文面としては C++20 で POD はもう削除されていて POD の概念を使わない形で再編されてる。
std::is_pod はまだある (非推奨) からこれが POD の定義だという意味ではまだあるとも言えるけど。
111デフォルトの名無しさん (ワッチョイ 06a2-M+UX)
2024/01/01(月) 00:46:34.65ID:l/ylj5kb0
アライメント忘れてるぞ
112デフォルトの名無しさん (ワッチョイ e1f0-JZT3)
2024/01/01(月) 03:01:35.02ID:5pNbZa2B0
>>104
まず自分でコード書いてみ
よろしくないところは指摘してやるから
113デフォルトの名無しさん (ワッチョイ 8101-KEYj)
2024/01/01(月) 03:14:22.37ID:8zoq4UeO0
オワコン名称出してマウント。プークスクス
114はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/01(月) 03:40:47.98ID:hmX3WjmM0
POD が削除されたかどうかは重要ではなくて、 POD より弱い制約 (trivially copyable) で memcpy が許されるというのが主旨。
その点は C++11 からそうなってる。
115はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/01(月) 04:06:49.46ID:hmX3WjmM0
「構造体」ってのも C++ 用語的にはイケてないと思うよ。
116デフォルトの名無しさん (ワッチョイ d24b-WshQ)
2024/01/01(月) 04:55:26.71ID:e5pnn2Xx0
アライメントは基本型のどれかと同じアライメント制約に合わせれば良いいということなら
使おうとしているうちで最も厳しいアライメント制約に一致する基本型を含むunionで解決するというのがC言語における伝統的な手法という印象、
C++でunionにしたら(それが可能なメンバのみなら) memcpyは安全とかにはならない?
117はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/01(月) 05:30:52.12ID:hmX3WjmM0
>>116
コンストラクタや代入演算子がトリビアルであることなどの制約を守れば共用体も trivially copyable になりうる。
(C++ の共用体はコンストラクタやメンバ関数を定義できるがそこらが制限されることになる。)
118デフォルトの名無しさん (ワッチョイ 65e8-QK8A)
2024/01/01(月) 14:24:55.17ID:kge3DGj60
char* と long* のコピーは?
119はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
2024/01/01(月) 15:31:30.97ID:hmX3WjmM0
ポインタも含めてスカラ型は Trivially copyable
https://timsong-cpp.github.io/cppwp/n4861/basic.types#9
120デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2024/01/03(水) 23:34:38.84ID:w4EAqTeZ0
>>112
とりあえず書いてみたけどどうですかね?

template<std::size_t buf_size>
struct A {
private:
struct base_ {
virtual ~base_() {};
};
template <typename F>
struct derived_ : base_ {
F f_;
derived_(F f) : f_{ std::move(f) } {}
};
base_* p_;
alignas(alignof(std::max_align_t)) uint8_t buf[buf_size]={0};

public:
A() :p_(nullptr) {};
template <typename F>
void assign(F f) {
if (p_ == nullptr) {
p_ = ::new (buf) derived_<F>{std::move(f)};
}
}
//コピーコンストラクタ
A(A& src) {
p_ = ::new (buf) decltype(src.*p_); //ここが怪しい
};
};
121デフォルトの名無しさん (ワッチョイ 9901-r6/T)
2024/01/04(木) 00:44:07.87ID:/FDyuY0i0
decltype(src.*p_)ってbase_なのでダメだろう
122デフォルトの名無しさん (ワッチョイ e1f0-JZT3)
2024/01/04(木) 00:58:18.81ID:ECF9R1Fj0
ていうか、decltypeで型指定してるだけだからコピーもなにもされてないぞソレ
123デフォルトの名無しさん (ワッチョイ 0644-M+UX)
2024/01/04(木) 02:28:40.49ID:oZapr/U70
std::anyのコードでも読んだほうが早い
124デフォルトの名無しさん (ワッチョイ 9901-r6/T)
2024/01/04(木) 09:11:56.12ID:/FDyuY0i0
A::base_に以下を足してA::derived_で実装し
Aのコピーコンストラクタから呼べば?
virtual base_ *clone (void *p) = 0;
125デフォルトの名無しさん (ワッチョイ 6564-QK8A)
2024/01/04(木) 13:26:37.40ID:1KQpMTCj0
void*って、ポインターの先のサイズ未知だよなぁ
126デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2024/01/04(木) 17:16:40.43ID:ACseOt7T0
derived_かそのメンバf_の型を知るにはRTTIしかないのですかね?

>>121
decltypeだと派生先の型はわからないのか

>>122
実体のコピーの処理が抜けてました…
127デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2024/01/04(木) 21:53:05.60ID:ACseOt7T0
>>124
こんな感じです?

struct base_ {
virtual base_* clone (void *p) = 0;
virtual ~base_() {};
};

template <typename F>
struct derived_ : base_ {
F f_;
derived_(F f) : f_{ std::move(f) } {}
base_* clone (void *p_buf){
return new(reinterpret_cast<derived_<F>*>(p_buf))(f_);
}
};

A(A& src) {
p_ = src.clone((void*)buf);
};
128デフォルトの名無しさん (ワッチョイ e1f0-JZT3)
2024/01/04(木) 22:19:16.70ID:ECF9R1Fj0
derived_(F f) ←この時点でムダなコピーが1度発生していることには気付いてる?
129デフォルトの名無しさん (ワッチョイ 9901-r6/T)
2024/01/04(木) 22:21:15.81ID:/FDyuY0i0
>>127
書き込む前にコンパイルしなよ
130デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/04(木) 22:41:26.61ID:Dv09vJ7A0
バッファの中にオブジェクトを作れたら、それで何をしたいのかが気になる
131デフォルトの名無しさん (ワッチョイ 0644-M+UX)
2024/01/04(木) 23:21:36.86ID:oZapr/U70
>>127
cloneの中ってplacement newでcopy constructorを呼ぼうとしてるんだよな?
いちおうあってるけどundefined behaviorまみれ
132はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/04(木) 23:35:27.70ID:td6kYpbC0
たぶんやりたいことは std::allocator_traits::construct なのかな
133デフォルトの名無しさん (ワッチョイ 7f7c-JApz)
2024/01/11(木) 04:45:44.72ID:wlSOhq+Y0
例外って全部mainで捕捉すべきかな?

調べてみたら例外が捕捉されずにプログラムが終了する場合スタックアンワインドが起こるかは実装定義みたいなんだけど、それじゃグローバルなオブジェクトのデストラクタが呼ばれないんじゃないかって思って試してみたのよ。
https://ideone.com/wSLZfL
やっぱりデストラクタは呼ばれなかったからリソースリークが起こりうるんじゃないかと思うんだけど、例外に対してはどういう態度でいるべきかな?

A. リソースリークはまずい。だから例外は全部捕捉するべき。
B. 例外はロジック上捕捉する必要があるものだけ捕捉して、それ以外はほっといていい。
C. 例外が捕捉されなければstd::abortが呼ばれるので、コアダンプなりで色々調べることもできる。だからmainで例外を全部握りつぶすようなことはすべきではない。
D. 時と場合による。

例外時の挙動とか仕様とか調べてるうちに頭ぐるぐるしてわけわかんなくなってきた
134デフォルトの名無しさん (ワッチョイ dff7-1VUN)
2024/01/11(木) 08:40:16.50ID:8oRrkiTZ0
そもそもプログラムが終了してリソースリークするのかな?
メモリー、ファイルハンドル、ソケット、ミューテックスなどのリソースはOSが責任持って解放するよね
どのようなリソースがリークしますか?
135デフォルトの名無しさん (ワッチョイ 7f01-2R+Q)
2024/01/11(木) 08:45:02.51ID:ETJgFBFV0
すべてじゃね?
136デフォルトの名無しさん (ワッチョイ 7f01-2R+Q)
2024/01/11(木) 08:46:53.81ID:ETJgFBFV0
>>133
すべてじゃね?
それらの選択肢は別に排他的な選択肢じゃないかと
137デフォルトの名無しさん (ワッチョイ 7f3a-NF1f)
2024/01/11(木) 09:02:22.25ID:dA95iQ6m0
OS管理なリソースはアプリの終了なんか知らないってのもあるからなぁ
得にドライバ関連とかな
138デフォルトの名無しさん (ワッチョイ dfab-acFs)
2024/01/11(木) 15:30:41.76ID:hAXa3uBd0
>>136
あれ、少なくともAとCは排他的だと思うんだけど
全部の選択肢を選ぶとすると具体的にはどうなるのかな
139デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:09:25.46ID:AWAYnmwT0
今どきのOS使ってたらOSリソースはリークしない
まぁプロセスがゾンビになるのはよくあるが
140デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:09:51.72ID:AWAYnmwT0
>>137
しったかすんな
141デフォルトの名無しさん (ワントンキン MMdf-7Pe6)
2024/01/11(木) 20:12:29.21ID:h5T3Zf1WM
そもそもアプリ的にデータの不整合とか出るから論外だろう
ファイルやなんかの外部データ使わないなら関係ないだろうけど
142デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:12:30.15ID:AWAYnmwT0
よくあるのは異常終了時にファイルをフラッシュしておきたいとかだろ
汎用的にこれを実現するのは結構むずい
143デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:14:10.04ID:AWAYnmwT0
あとコアダンプの観点では例外飛ばさずに即死したほうがいい
144デフォルトの名無しさん (ワッチョイ df5a-XokC)
2024/01/11(木) 21:36:53.22ID:40hQdtQK0
エラーだからって一時ファイル山盛り残して放置しないでください
145デフォルトの名無しさん (ワッチョイ 7f7c-acFs)
2024/01/11(木) 22:44:37.94ID:wlSOhq+Y0
質問した者だけど

確かに近代的なOSであればリソースの始末はよしなにやってくれるだろうし、「絶対にデストラクタが呼ばれなきゃ困る」って状況でもなければいちいちすべての例外を捕捉する必要はないのかな(毎回ボイラープレートコードみたいに書くのもやだし)
146デフォルトの名無しさん (スッップ Sd9f-d+nK)
2024/01/12(金) 01:18:38.26ID:P05ikaaEd
例外処理って、メモリ破壊やファイルシステム破壊みたいな絶望的な状況を想定しなきゃいけないんだよ。
ファイルに何か書き込んだら他のファイルを壊しちゃうかもしれない、みたいな。

だからファイル関連の操作をしていいのは、ファイルシステム周りの無事を確信できるときだけ。
データを上書き保存とかしていいのは、データとファイルシステム両方の無事を確信できるときだけ。
何も確信できないときは、何もせずに墜ちなきゃいけない。

ってことで例外機構はデフォルトで何もせずに異常終了するようになってるんだよ。
147はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Cx9t)
2024/01/12(金) 02:09:19.72ID:Z8/dVhwe0
理想的には全ての例外はキャッチされるべき。 ただ、現実は理想的ではない。
キャッチするのは対処するためなので想定漏れで思ってもなかったような例外が上がってきた (対処が出来てない) ならそれはバグなんだから検証して修正する必要があるわけだし、検証しやすい形で止まったほうがいい。

C++ ではスタックの巻き戻しの途中で例外を送出したときの挙動は未定義なので通例ではデストラクタから例外を投げないように設計される。
つまりデストラクタでの後始末に失敗したらもうそれを (例外機構の仕組みでは) フォローできない。
想定されてない例外が上がってるときに後始末がちゃんとできずにわけのわからない動作を引き起こしたら検証にも支障がある。
148デフォルトの名無しさん (ワッチョイ 7f7c-acFs)
2024/01/12(金) 09:48:31.22ID:1nCpSyqU0
じゃあ「投げられうるすべての例外に適切な対処ができるのが理想的だが、対処しきれない例外は投げられっぱなしにする(そしてプログラムを即座に異常終了させる)方が、思考停止でとりあえず捕捉しておくよりはまだマシ」ってことになるのかな
みんなありがとう
149デフォルトの名無しさん (ワントンキン MMdf-7Pe6)
2024/01/12(金) 09:51:15.81ID:Vmsz+UsIM
いやいや、ちゃんとデバッグしろよ
こんなやつとは絶対一緒に仕事したくない
150デフォルトの名無しさん (ワッチョイ 5f4e-1VUN)
2024/01/12(金) 09:58:11.40ID:yLdIK4jH0
ライブラリ書くときはライブラリで対処できない例外は握り潰さずに上位で伝搬させろ!と言われてるよね
アプリも同じだと思う
明確に対処すべきことがあるなら例外をキャッチすればいいし
ないならそのままプロセス落としてOSに任せればいいんでない?
151デフォルトの名無しさん (ワッチョイ 7f7c-acFs)
2024/01/12(金) 10:01:16.79ID:1nCpSyqU0
投げられっぱなしにするって言い方が不適切だったかな、別に例外のせいでプログラムが実際に異常終了するのを見ても知らんぷりするって意味じゃないよ
実際にプログラムが異常終了したんだったらその都度原因は突き止めて修正するし、そもそもすべての例外に網羅的に対処するのが現実的なときは最初からそうするよ
152デフォルトの名無しさん (ワッチョイ df09-dvWY)
2024/01/12(金) 10:06:03.47ID:Umd8uX9b0
try {} catch {}
153はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-TQnC)
2024/01/12(金) 17:12:14.63ID:Z8/dVhwe0
想定される状況には対処しているならどこで想定漏れがあるかはやってみないとわからない。
経験を蓄積し続けるしかしょうがないんだよな。
蓄積がテストケースの形などになっているとより良いと思う。
154デフォルトの名無しさん (ブーイモ MM0f-Nf4k)
2024/01/12(金) 17:26:50.90ID:059LeD4FM
自分の知らないライブラリの奥底からいつ投げられるかわからない例外なんて対処しようがない
かつスタックアンワインドしたらデバッグの手がかり消えるだけ
155デフォルトの名無しさん (ブーイモ MM9f-2j6O)
2024/01/12(金) 17:44:35.30ID:bUlwQWI8M
setjump()/longjump()
156デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 13:54:58.62ID:rNqWj2dY0
やっぱC++の例外は悪……
構造化例外ならwindbgでコアダンプを開いて!analyze -vで発生源を調べられる(仕組みは知らん
がC++の例外は例外オブジェクトが持ち出した情報が全て……
という印象……
157デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 14:10:21.49ID:rNqWj2dY0
やっぱ例外というブツは、
アプリケーション領域においてプログラミがいろんなリソースを取り扱うようになった結果、
C言語流に関数の戻り値で起こり得る全てのエラーを網羅してチェックする方法が
現実的でなくなってきたから設けられたブツなので
>自分の知らないライブラリの奥底からいつ投げられるかわからない例外(>>154
すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿

起こりえる全ての例外の処置を書かなければ設計とは言えない主義の人(>>149)は
寧ろ例外の使用をやめてC言語的な書き方で全てのエラーをチェックすべき
(他人様が作ったライブラリが例外を飛ばしてくるのは仕方が無いから全てcatchする
158デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 14:15:12.02ID:rNqWj2dY0
つなみにOSの内部ではすべてのリソースをOSが管理する前提なので例外の出る幕は無い
OSの設計に対して想定外の事象がOS内部で起きるとかあり得ないじゃない
レトロな(しかしメジャーな)OSがC++ではなくC言語で書かれ続けるのはそういう理由
159はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-TQnC)
2024/01/13(土) 14:21:37.75ID:3bve4IFf0
何が返ってくるかわからん (ドキュメント化されていない) なら返却値の形になっていても正しく対処できないのは同じだろ。
160デフォルトの名無しさん (ワッチョイ ff18-Nf4k)
2024/01/13(土) 14:37:35.65ID:b/trpwza0
例外だとテストしないドキュメントにも書かないというモラルハザードがおきやすいとは言えるだろう
返り値はエラー体系を自分で定義しないといかんからそうはなりにくい
まぁそれでも失敗を安易にfalseに丸めるどアホは多いけど
161デフォルトの名無しさん (ワッチョイ ffcf-mfjK)
2024/01/13(土) 15:22:27.34ID:o+zGF69d0
>>157
>すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿

それ一般にはリリース後に起きちゃいけないことでは。プロダクトにもよるが防ぐ努力は必要だと思うがね。
162デフォルトの名無しさん (ワッチョイ 7291-Qz6p)
2024/01/14(日) 13:01:30.73ID:H7tsxQrq0
>>138
全選択肢を同時に選ぶって意味に捉えられちゃったかな?
そうじゃなくて、その選択肢自体が同時に適用すべきレベルのものじゃないと思うの

例外をキャッチするって決めたなら、そこには目的があるよね?
設計手順としては目的を決めてから例外を使おうって判断になるわけ

その目的次第だよね?っていうのがD
目的がリソースリーク防止ならA
Aのような目的を達成するために、目的範囲内でB
デバッグ目的ならC

製品等で客の目に見せたくないなどの営業目的があるならCはダメで、のべつまくなしBというのもあるかもしれない
163デフォルトの名無しさん (ワッチョイ 7291-Qz6p)
2024/01/14(日) 13:06:09.91ID:H7tsxQrq0
大きな目で全工程トータルを考えると全部の選択肢を適用する必要があるし、適用のしどころが違うと思うってのが>>136の真意でした
164デフォルトの名無しさん (ワッチョイ 7291-Qz6p)
2024/01/14(日) 13:12:37.16ID:H7tsxQrq0
>>148
これが正しいかどうかはおいといて、人命に関わらないなら、自分はその考え方に賛成!

完璧にデバッグしろというのは自動車と医療機器など人命にかかわるものだね
重要度に応じて工数のかけ方が変わってくるので、すべてのソフトウエアで一概にこうしなさいとは言えないかな

そういう意味ではD
165デフォルトの名無しさん (ワッチョイ 4d34-7Ntv)
2024/01/14(日) 15:16:56.65ID:by9QQMRz0
>>162
ああ、なるほどね
分かりやすくありがとう、助かりました
166デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 08:10:14.00ID:Y8oMeLNI0
人命にかかわらない場合であっても、末端の関数が投げる例外の種類を見落としただけでプログラム全体が
いきなり落ちるのは勘弁してほしいし、それを防ぐために全部の関数が投げる例外の種類を全部把握するというのも
無理ゲーに近い。
なので適当なレイヤーごとにざっくり std::exception をキャッチする造りにしてるな。例外の種類で選択したりはしない。
167デフォルトの名無しさん (ブーイモ MM22-7+/r)
2024/01/15(月) 11:54:06.38ID:0QYW1wwzM
キャッチしてその後どうすんの?
168デフォルトの名無しさん (ワッチョイ 41f0-u9am)
2024/01/15(月) 18:12:26.71ID:FtZTeDOW0
何するか思い付かないならPG辞めろ
貴様には向いてない
169デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 18:20:04.00ID:Y8oMeLNI0
>>167
そのtryブロックの処理が失敗したものとして処理を続ける。
170デフォルトの名無しさん (ワッチョイ 46ea-7+/r)
2024/01/15(月) 18:42:14.36ID:Lgn9c/GO0
テストケース爆増じゃん
171デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 19:20:39.72ID:Y8oMeLNI0
なんで爆増?
172デフォルトの名無しさん (ワッチョイ 46ea-7+/r)
2024/01/15(月) 20:40:13.04ID:Lgn9c/GO0
その失敗する処理の具体例言ってみて
173デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 22:10:56.13ID:Y8oMeLNI0
んでテストケース爆増の話は?処理の具体例次第で話が変わったりするとか?
174デフォルトの名無しさん (ワッチョイ 46ea-7+/r)
2024/01/15(月) 22:45:20.95ID:Lgn9c/GO0
依存関係のあるものに影響あるのは当たり前
原因不明の例外起こっても突き進むんだったら擬似的にそのケース作ってテストするわな普通は
出し渋るなら別にださなくていいよ
参考にならなさそうだし
175デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 23:24:57.00ID:Y8oMeLNI0
それはいったい何のテストなんだろう。原因不明の例外を首尾よくキャッチできるかどうかテストしろと言っているんだろうか。
そもそもそういう例外を想定するなら、スルーして影響範囲が広がる方がテストは厄介になると思うがなあ。
176デフォルトの名無しさん (ワッチョイ 11fb-5Qxc)
2024/01/15(月) 23:36:35.23ID:rchiNbsm0
たとえば業務用のラベルプリンターでAPIが提供されてるとか
とりあえず try ~ catch して「印刷中に不明なエラーが発生しました」みたいなまとめかたはあるかなー
177デフォルトの名無しさん (ワッチョイ 2778-EFyZ)
2024/01/23(火) 17:00:13.54ID:kD0da0AW0
すみません。質問させて下さい。次のコードがMinGW-w64 g++ v13.2では --itrでエラーになります。わからないのはVisual studio 2022およびVisual StudioがサポートするClang LLVMでは通って正しく
実行しているように見えます。--itrの仕様がないのはMinGW-w64 g++v13.2が正しいのでしょうか?それともVisual Studioが正しいのでしょうか?

#include <iostream>
#include <unordered_set>
using namespace std;

int main()
{
unordered_set<int> us = { 1,2,3,4,5,6 };

for(auto itr = begin(us); itr != end(us); ++itr) cout << *itr << endl;

auto itr = us.begin();
++itr; ++itr;
cout << *itr << endl;

--itr;
cout << *itr << endl;

cin.get();
return 0;
}

MinGW-w64 g++ v13.2のエラー
// error: no match for 'operator--' (operand type is 'std::__detail::_Node_iterator<int, true, false>')
178はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-G0Zh)
2024/01/23(火) 17:23:45.88ID:MIeJSKFF0
>>177
unordered_set は forward iterator をサポートしているという規定がある。
https://timsong-cpp.github.io/cppwp/n3337/unord.set.overview#1
forward iterator は進めることは出来ても戻ることはできない。
この場合は operator-- がないのが正しい。

拡張してより高機能なライブラリを提供しても仕様に反するってわけではないけど
マイクロソフトのドキュメントでも特に拡張しているという文面は見当たらないから
あんまりあてにしないほうが良さそうには思う。
https://learn.microsoft.com/en-us/cpp/standard-library/unordered-set-class?view=msvc-170#iterator
179デフォルトの名無しさん (ワッチョイ 2778-EFyZ)
2024/01/23(火) 17:34:44.31ID:kD0da0AW0
おお、ありがとうございます。
180デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 11:36:45.25ID:W0uCnQb30
>>173
横やが関数foo()で1つの例外が発生したらその時点のfoo()呼び出しに至る10個かそこらの関数が中断されるわけや
すなわち関数bar()が
  処理A→B→C→D→return
の順で処理が進むことを気体しているところに、Bで呼び出している関数baz()がfoo()を呼び出している結果、foo()で例外を生じると
  処理A→B→return
という処理順に変更になる。こうなっても大丈夫なようにtry { 処理B } catch ((fooが投げる例外)& e) { (eに対する適切な処置) } を書かねばならず、
これが実は潜在的には処理A、B、C、Dのどこでも起き得るから厳密なことを言えば全てについて書かねばならず、
それがfoo()呼び出しに至る10個かそこらの関数それぞれについて行われねばならない。
検証もそんだけ組み合わせが増える。
181デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 11:40:58.52ID:W0uCnQb30
というわけでそんなの現実には不可能なので、現実的な処置としては
・ライブラリ製作者はなんか都合が悪い事が起きたら何でも呼び出し元に返す。
 第1選択としてはエラーステータスを返すことを検討し、それではコードが煩雑になりすぎる場合は例外を投げて異常を知らせる
・ライブラリを使う人はライブラリが例外を投げない条件で使うことを心掛け、自前のコード内でtry { } catch() { }を極力しない
という処置になるわ
けや
182デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 12:02:32.93ID:Gsm093HM0
catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。
その場合の検証が必要だというならどっちも必要だろ。
183デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 12:13:11.85ID:W0uCnQb30
>>182
>catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。
それは問題の認識がおかいし
例えば以下のコードにおいて、スレッドのゾンビを生じさせないためにはfuncB()をtry { } catch () { } は必須になる。
 void bar() {
  funcA();  // スレッドxを起動
  funcB();  // 中でbaz() → foo()の呼び出し
  funcC();  // スレッドxに停止シグナル発酵
  funcD();  // スレッドxの終了待ち
  return;
}
このように一般に例外が飛んでくる関数にはcatchするかしないかの選択権など無い
例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない

一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある
184デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 12:14:54.75ID:W0uCnQb30
訂正orz
誤:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない
正:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外が飛んでくる想定であるならばcatchせねばならない
185デフォルトの名無しさん (ワッチョイ 797c-+np5)
2024/01/28(日) 12:19:26.10ID:/bXkl1Cz0
>>183
それはfuncB()に失敗の可能性がある時に必ず必要な話だろ?例外どうこうじゃないじゃん
funcB()が例外を投げずに古き良きintのエラーコードを戻り値で返す場合は何かが変わるの?
まさか「funcBの戻り値をガン無視すればfuncCもfuncDも実行されてくれるから完璧!だから例外はクソ!」っていうゴミカスみたいな主張をしたいわけじゃないよね?
186デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 12:28:00.13ID:Gsm093HM0
>>183
それはcatchが必要かどうかの話だろ。
catchしたらテストケースが増えるかどうかという話とはなんも関係がない。
187デフォルトの名無しさん (ワッチョイ 5ef3-qitC)
2024/01/28(日) 15:40:48.23ID:JnoCOYDS0
そもそも未知の例外飛んできた時点でそれを通したライブラリの例外安全性が守られてるか怪しいと考えるべき
188デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 17:01:39.99ID:Gsm093HM0
例外安全性を守るのに例外の種類やそれが既知か未知かは関係ないだろうが、
仕様に明記した例外以外は堰き止めるのが正解だろうなあ。
189◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/28(日) 20:27:29.75ID:0TnCAHFI0
思い立って結城さんのデザパタ(古いjava で記述)を総称型(テンプレート)もちゃんと使ってC++ に書き直しているけれども、
new/delete からptr::shared_ptr に書きなおすと、もう構造がわかりにくくなってしまってどうしようもない
デザパタ=抽象クラスプログラミングは C++ ではオワコンなの?
Visitor パターン
new/delete: https://ideone.com/6d43LO スッキリ書けてきもちいい
std::shared_ptr: https://ideone.com/oYzkxh 恐ろしい宣言の連発

>std::shared_ptr<Iterator<std::shared_ptr<Entry>>> iterator() { return std::make_shared<VectorIterator<std::shared_ptr<Entry>>>(v); }

なんかもう書いてても意味不明
CONSTRUCTOR(CONSTRUCTOR *p) とかコピコン以外にもみたことのないコンストラクタが要求されるし
190はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+)
2024/01/28(日) 20:53:25.29ID:hRRbWEE/0
>>189
スマートポインタを使わないバージョンも C++ 的にはすっきりしてない。
動的多態の必要が必要ないのに持つべきメンバ関数を強制するためだけに抽象クラスを使っていて不恰好に見える。
コンセプトの導入がだいぶん後回しになった C++ の問題でもあるんだが……。
設計理念が妥当かどうかはともかくとして、元が Java なら直訳めいた C++ への置き換えがすっきりと書けるはずがない。
191はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+)
2024/01/28(日) 21:08:52.58ID:hRRbWEE/0
ざっと見た感じだと抽象クラスとして必要なのは Entry だけかな。
ジェネリックラムダが visitor パターンで使いやすいのでそういうのが使いやすいように配慮するといいかも。
std::visit が C++ での visitor パターンのお手本だよ。
192デフォルトの名無しさん (ワッチョイ b501-PlwZ)
2024/01/28(日) 22:46:18.85ID:VLKT1lFt0
>>189
usingなりtypedefでエイリアス作れば?
using Entry_Ptr = std::shared_ptr<Entry>;
193デフォルトの名無しさん (JP 0Hbd-DQL8)
2024/01/28(日) 23:17:29.01ID:wkb3ctO/H
面白そうだからちょっと書いてみた。大きな変更点はこんな感じ。

・accept が受け取るのは単に Visitor の参照でいい。ここで shared_ptr を使う必要はない。
・Visitor が受け取るのも File や Directory の参照でいい。
・SizeVisitor もいらない。File と Directory はともに Entry の子クラスとして getSize() を実装してるんだから、無理に visitor パターンを使わなくても単に getSize() を呼べばいいだけ。
・iterator() が返すのも VectorIterator の shared_ptr ではなく、単に VectorIterator を返せばいい。

全体的に使う必要がない場面で shared_ptr を使ってるのが目立ったと思う。

https://wandbox.org/permlink/ZBKbF5iMVpb7Looi

だいぶすっきりしたんじゃない?
194はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-MxBP)
2024/01/28(日) 23:52:27.85ID:hRRbWEE/0
なんかもうポインタをいじるのが面倒になったので値としてやりとりしていいやという気持ちと
標準ライブラリを積極的に活用することにしたらこうなった。
https://wandbox.org/permlink/BQCNjfdJRKWAR3dg
195◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/29(月) 04:35:04.36ID:M6sadnnj0
>>193
拝読させていただきました。なるほど、関係性を示すポインタ=参照なら std::shared_ptr でくるむ必要ガない、というわけですか。
>>194
拝読させていただきました。Entry を値で持つのはいやだなあ。 dectype の使い方を学ばせていただきました。
196◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/29(月) 05:00:34.95ID:M6sadnnj0
>>194
std::size_t()
あたりから読めていません。operator() をどう使っているのでしょうか?
197はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-MxBP)
2024/01/29(月) 12:08:36.13ID:WXyC0nMC0
スマートポインタを使うにしても std::shared_ptr って必要?
この場合は std::unique_ptr でよくない?
https://wandbox.org/permlink/dMolraFpQHKzYtF3

設計思想によるけどファイルシステムを表現するという前提だと
ひとつのルートディレクトリに連なる全てのエントリは実質的に一体のデータ構造なので
ルートディレクトリエントリの寿命が尽きれば全て解体ってことにしたほうが簡単でいいと思う。

ハードリンクの表現とかも考えるなら事情が変わってくることもあるだろうけど……。
198デフォルトの名無しさん (ワッチョイ bda8-xxv9)
2024/01/29(月) 21:21:12.23ID:eAAuxXw40
>>189 c++
https://ideone.com/p3li2Y
https://ideone.com/oYzkxh を元に若干の整理を行った

・他の人と同様shared_ptrを削除
 値で持てるところは単に値で持つほうがC++っぽいと思う
 ただ「Entry を値で持つのはいやだなあ」とのことなので部分的に残してる
 Javaの参照型変数をshared_ptrに置き換えようとして困るのは
 size_t File::accept(std::shared_ptr<Visitor> v) { return v->visit(std::make_shared<File>(this)); }
 ここがJavaだと単にvisit(this)で済むからスッキリするんだけど
 しかもこれmake_shared(this)だと多重開放するよね??

>>189 c++
https://ideone.com/2uUpwH
https://ideone.com/p3li2Y を元に若干の整理を行った

・make_shared<File>(this)の多重開放?を修正
 std::enable_shared_from_thisを使ってJavaの参照型変数っぽい使用感を得た。

・struct this_is_private {};
 これは単にコンストラクタを実質的にprivateにするためだけに使ってる
 https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
 https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const
 このへん参照されたし
199デフォルトの名無しさん (JP 0Hbd-IHfd)
2024/02/03(土) 04:38:02.47ID:bq1KvR69H
https://wandbox.org/permlink/LEl2MT7OdGIlVKC4

なんか「子クラスのコンストラクタに親クラスのオブジェクトを渡して子クラスのメンバを初期化する」(?)みたいなことができちゃってるんだけど、これってどういう仕様でこうなってんの?
Wandbox上だとC++2aではコンパイルできてC++17ではコンパイルできなかったからcpprefjpのC++20の機能の一覧も見てみたけどそれらしいものはなかったし
200はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-MxBP)
2024/02/03(土) 09:26:19.03ID:Sz70frqK0
>>199
designated initializer も C++20 からの機能なんだけど……それは脇に置く。

この場合は集成体初期化に該当する。
C++17 から基底の初期化も集成体初期化で扱えるので
child c{p};
というように初期化出来ていた。

更に C++20 では集成体初期化を丸括弧で書いても良いことになったので
child c(p);
とすることが許されるようになった。
201◆QZaw55cn4c (ワッチョイ 3555-LgJ8)
2024/02/03(土) 09:46:38.23ID:21sfApha0
>>198
>size_t File::accept(std::shared_ptr<Visitor> v) { return v->visit(std::make_shared<File>(this)); }
> ここがJavaだと単にvisit(this)で済むからスッキリするんだけど
> しかもこれmake_shared(this)だと多重開放するよね??
多重解放(二重解放)しないことはラッパをかませて確認済みです。そう簡単に std::shared_ptr は破綻しないと信じています
https://ideone.com/GUPcSu

それはともかく、皆様のご意見には感謝しております。これからもお伺いさせていただいた際にはよろしくお願いいたします。
202デフォルトの名無しさん (JP 0Hbd-IHfd)
2024/02/03(土) 09:48:07.39ID:bq1KvR69H
>>200
https://cpprefjp.github.io/lang/cpp17/extension_to_aggregate_initialization.html
これかあ
実は「childにコンストラクタがある場合」とか「childにprivateメンバがある場合」とか「childがparentをprivate継承している場合」とかはコンパイルが通らなくてもう意味が解らなかったんだけど、それもchildが集成体じゃなくなってたからだったんだね
ありがとう、勉強になった
203◆QZaw55cn4c (ワッチョイ 3555-LgJ8)
2024/02/03(土) 10:15:36.86ID:21sfApha0
>>198
>値で持てるところは単に値で持つほうがC++っぽいと思う
時代の流れを感じさせるお言葉です。なにせ K&R1 で育った世代なので(K&R1 では構造体の実体渡しはできず、かならずポインタで渡さなければならなかった)。
C++ においても、コピコンを働かせないために const & を多用する毎日です
204はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-MxBP)
2024/02/03(土) 14:49:57.28ID:Sz70frqK0
>>203
内部的に値で持つのでもポインタで持つのでもいいけど
「簡単に値として取り出せる」のはあまりよろしくないと思う。
これ (>>189) がおそらくファイルシステムを表現しようとするもの
だという前提を考えたらオブジェクトの構造も
ファイルシステムのモデルを抽象するものであるべきだと思うから。

ファイルはそれがある場所にも意味があるからファイルを象徴するオブジェクトが
場所から離れてやりとりされるのは違和感がある。

まあファイルシステムのモデルをどう捉えるかは私の感想でしかないから
何が妥当とは強くは主張しないけど、
いずれにしても実装上の都合じゃなくて使う側の感覚でどうなってて欲しいかという視点が要ると思う。
205デフォルトの名無しさん (ワッチョイ f7da-tydm)
2024/02/04(日) 11:53:17.97ID:nmDLw2WS0
はちみつさん頭いいね
アドバイスが丁寧かつ的確でいつも感心する
206デフォルトの名無しさん (ワッチョイ 5702-VoFb)
2024/02/05(月) 20:47:16.57ID:dvRwXcQL0
ある構造体(集成体)Aについてconstexprでa1, a2, a3・・・といくつか作りました
別のクラスBのメンバ変数にconst A* m_ptrAがあってconstexprで作ったインスタンスのどれかを指すことにします
この時Bのメンバ関数などで、
if(m_ptrA== &a1) という比較・条件分岐を行うのは意味のある比較になっているのでしょうか?
207デフォルトの名無しさん (ワッチョイ bfe1-tai3)
2024/02/05(月) 21:20:14.92ID:crhbGtf+0
意味はある
でもなるべくそういう判定は無しでいけるように設計したいところだよな
Aクラスを作ってる意義が薄れる

あと細かいこと言えばaddressofを使ったほうが汎用的というのはある
c++のクソっぷりが如実に表れている関数
208デフォルトの名無しさん (ワッチョイ 5702-VoFb)
2024/02/06(火) 11:08:08.32ID:KJUqS3Ww0
ありがとうございました
本当に列挙型代わりに使えるのなら面白いとも思いましたが
まあ変なコードには間違いないですね
209はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-11P2)
2024/02/06(火) 12:11:55.01ID:gR/xoQQt0
分岐の内容次第ではあるけど……Bが指しているAのオブジェクトごとに処理を切り替えるってのなら
a1, a2, a3 …… がそれぞれ関数 (関数オブジェクト) を指す (所有する) ようにするのが常道ではあるね。
Bのメンバ関数の中では呼び出しを一文書くだけでいい。

分岐条件を網羅しそこなうしょうもないミスはよくあることだから
手作業での網羅を避けられるならそのほうがいい。
210デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/06(火) 20:42:09.19ID:WnlTLfV5M
「The C Standard says that array indexes are (signed)
integers.
The reason behind that is that pointers and arrays
are close in C. For example, tab[index] is strictly
equivalent to *(tab + index). You can use pointer
arithmetic with negative values, hence an array
index can be negative」
とあるので、C 言語での配列添え字は符号付き整数
ですね。
しかし、C++ では、size_t とされ、符合なし整数
のようですが、矛盾しませんか?

VC++の以下のマクロでは、
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
eが偽の時にエラーになるようになっているようです。
これはつまり、
typedef char aaa[-1];
がエラーになる事を前提にしているようです。
しかし、もし、配列の最大要素数が、符合なし整数
であるならば、32BIT 環境の場合、
-1 は、0xffff_ffff と同じと言えば同じであるはずで、
コンパイラ内部で効率よく区別するのは難しいはずです。
どうしてるんでしょう。
211デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/06(火) 20:47:53.26ID:WnlTLfV5M
何がいいたいかと言えば、32BIT環境だと
符号付き整数の最大値は、
0x7fff_ffff ですから、
char a[0x7fff_ffff];
は合法ですが、
char a[0xffff_ffff];
はエラーです。よって、
char a[-1];
はコンパイラは難しい処理をしなくても、
-1 は内部表現が 0xffff_ffff ですので
そもそも範囲外の数値と見なせます。
ところが、もし、配列最大数が unsigned
の領域まで許されるならば、要素数が
0xffff_ffff の配列も合法だということに
なります。
ならば、要素数の[] の中に-1 を指定した
場合の処理は難しくなりそうだ、ということです。
なおそもそも、32BIT の Windows 環境
だと、ユーザーが使えるアドレス空間は
最大で 0x7fff_ffff 程度までですから、
バイト数的に確保は出来ませんが。
ならば、そもそも、C++がunsigned 型
であるところの、size_t を採用しているもの
なかなか不可思議であります。
212デフォルトの名無しさん (ワッチョイ bfe1-tai3)
2024/02/06(火) 21:10:01.10ID:cxCkHHUF0
長いからよく読んでないけどコンパイラは型を認識をしてんだから-1と0xFFFFFFFFは区別してるだろ
213デフォルトの名無しさん (ワッチョイ 5772-hPhG)
2024/02/06(火) 21:25:24.39ID:82wR+tAN0
call -151
214デフォルトの名無しさん (ワッチョイ 377c-Hbjn)
2024/02/06(火) 22:29:48.57ID:SZ6XHr3I0
C++の配列添字はstd::ptrdiff_t(符号付き)です
215デフォルトの名無しさん (JP 0H0b-KLri)
2024/02/06(火) 22:36:10.13ID:pbGHBGq1H
配列を宣言するときの構文と添字演算子を使うときの構文を混同してない?前者はブラケットの中身が正じゃなきゃだめで後者は負でもいいってだけの話だと思うんだけど

int main()
{
int hoge[-1]; // ここで負の値を指定することはできない

hoge[-1]; // でもこれはいい (*((hoge)+(-1)) と解釈される)
}

せっかくだからC++23の仕様書も見てみたけど、§9.3.4.5の1には「配列のサイズはstd::size_t型(に変換された)定数式で、その値は0より大きくなければならない」って書いてあって、§7.6.1.2の2には添字は「スコープ無し列挙型か整数型」て書いてあったよ(該当箇所だけつまみ読みしたから正しく読めてる保証はできないけど)
216はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-42qO)
2024/02/07(水) 01:09:12.04ID:kuiQPbhX0
>>210
C の配列宣言子の角括弧内に書ける数値は 0 より大きい値に評価される整数定数式であることが条件で、具体的な型に規定はない。
式の型がなんらかの具体的な型に強制 (型変換) されたりはしないので signed int なら signed int だし、 unsigned int なら unsigned int のままだ。
VLA のときは定数式という条件は外れるけどそれ以外の制限はだいたい同じ。
C の添字演算子の場合もそう。 型は整数であればよい。
(値は制限の範囲内である必要はある。)

どこで見た説明を根拠にしているのか知らんけど、その signed が括弧書きなのは signed 「でもよい」という意味だと思うよ。
217デフォルトの名無しさん (ワッチョイ bf9a-Ehcu)
2024/02/07(水) 12:42:17.44ID:7NJYw5ei0
std::functionって、有効な関数がセットがされているかどうかでブール値を返しますが、
一旦有効化した後にこれを無効化したい場合って、nullptrを代入したりしていいんでしょうか
そしてその場合std::functionの中身はうまいこと解放されたりするんでしょうか
場合によってはラムダ式を使ってオブジェクトをキャプチャしていたりして
あまりその辺りの説明が見当たらない感じがしました
218デフォルトの名無しさん (ワッチョイ bfb0-tai3)
2024/02/07(水) 12:56:29.41ID:0txhPX/d0
それでいいよ
219はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-42qO)
2024/02/07(水) 13:12:18.32ID:kuiQPbhX0
>>217
https://timsong-cpp.github.io/cppwp/n3337/func.wrap.func.con#15
220デフォルトの名無しさん (ワッチョイ bf9a-Ehcu)
2024/02/07(水) 14:19:19.97ID:7NJYw5ei0
>>218
ありがとうございます!
221デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/07(水) 18:20:13.87ID:aGYGzZDDM
>>212
>長いからよく読んでないけどコンパイラは型
>を認識をしてんだから-1と0xFFFFFFFFは
>区別してるだろ
char a[100-101];
みたいに結果的に -1 になった場合は、
32BITコンパイラの場合、果たして内部で
0xffff_ffff
と区別をつけているかどうか。
unsigned型と考えれば0xffff_ffffであり、
signed型と考えれば -1 です。
ターゲットが 32BIT Windows どちらもエラー
になる可能性は高いですが、理由は結構異なる
と言えば異なると思います。
222デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/07(水) 18:25:16.10ID:aGYGzZDDM
もっと言えば、32BIT ターゲットで、
char a[0x80000000 | 1];
みたいな場合、中味は signed と
捉えれば「負数」ですが、unisgned と
捉えれば、0x80000001 という大きな値
に過ぎません。
どちらもエラーになる可能性が高いですが。
223デフォルトの名無しさん (ワッチョイ bfb0-tai3)
2024/02/07(水) 18:40:38.44ID:0txhPX/d0
リテラルにも型がある
1はint
0x80000000はunsigned int
演算結果はunsigned int
ルール決まってるから
224デフォルトの名無しさん (ワッチョイ d7f0-P/QA)
2024/02/07(水) 18:55:38.23ID:V2I2BIn30
x86のアセンブラのディスプレースメントは符号付いてるけどな
他のマシン系はワカランけど
225デフォルトの名無しさん (ワッチョイ bfa4-syIJ)
2024/02/07(水) 20:52:20.31ID:L6yrYnPT0
>>222
32bit環境には64bit整数はないと思ってるの??
226デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/08(木) 18:55:38.81ID:DVUqgRU9M
>>223
なるほど。そうなるわけですね。
本当に書いた人の意図がどうかに関わらず、
規則で決まっていると。
1UL のように書いてあれば unsigned。
そして、UL のようなものを書いてない場合、
1 のように小さな値は、signed ですが、signed の
範囲を越えるようなものは、unsigned になる、
などの規則があるわけですね。
227デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/08(木) 18:56:00.93ID:DVUqgRU9M
>>225
そういう問題ではないようですが。
228デフォルトの名無しさん (ワッチョイ 5763-dZsi)
2024/02/10(土) 12:18:06.78ID:KJGevrBa0
>>185
>>183の主張の
>一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある
が完全に読み飛ばされている件について:

例外を生じないライブラリの使い方で設計したら、funcB()から例外が飛んでくるのはバグなので
調査と修正の対象になる。
(結果的にやっぱtry { funcB(); } catch (/*略*/) { ... } いるじゃーん?となる可能性はあるがたいていはそうはならない

>>188のように自分が何をやっているのか認識しないまませき止めるのは論外すぐる……
229デフォルトの名無しさん (ワッチョイ 5763-dZsi)
2024/02/10(土) 12:26:53.58ID:KJGevrBa0
>>186
>catchしたらテストケースが増えるかどうかという話とはなんも関係がない。
あっる
catchする必要性箇所を設計で厳選すればcatchが減るのだからテストケースは減らし得る

例外を使う場合:
スルーしたりcatchして再スローが生じるfoo()の呼び出し箇所(とするのが現実的でないなら呼び出しパティーン)がm個、
スルーしたりcatchして再スローする段数が(簡単のためここでは平均とする)a個、
foo()が例外を生じるパティーンがn個なら、m^a^n個のテストケースが必要なところであるが

catchする必要性箇所を設計で厳選した場合:
foo()の呼び出し箇所(とするのが現実的でないなら呼び出しパティーン)がm個だとしたら、
例外が飛んでこないことを確認するのテストケースがm個のオーダーで要るだけ……
230デフォルトの名無しさん (ワッチョイ 377c-Hbjn)
2024/02/10(土) 16:57:16.73ID:Qku1mp0Z0
>>228
読み飛ばしてねえよ
funcB()は処理を中断すべきエラーが発生する可能性があるんだろ?だったらそれを適切に処理して後続の処理をやったりやらなかったりする必要があるわけだろ?
それはfuncB()がエラーを例外で返そうと戻り値で返そうとなんか他の方法で返そうと何も変わらないはずじゃないか
231デフォルトの名無しさん (ワッチョイ ffcf-HxQs)
2024/02/10(土) 18:55:23.41ID:0f3gz8pL0
>>229
>例外が飛んでこないことを確認するのテストケースがm個のオーダーで要るだけ……

いったい何をテストしようとしているんだろうか。
仮に「例外が飛んでこないことを確認するテスト」なるものができたとして、catchしたらそれができなくなるのか?

前半のよくわからない計算はcatch句を書いたらそのC0網羅のためのテストケースが必要になるとかいうことなんだろうか。
232デフォルトの名無しさん (ワッチョイ ffcf-HxQs)
2024/02/10(土) 20:56:08.28ID:0f3gz8pL0
>>228
>>>188のように自分が何をやっているのか認識しないまませき止めるのは論外すぐる……

どこが論外?>>169でぜんぜん問題ないが。
233デフォルトの名無しさん (ブーイモ MM8f-tai3)
2024/02/10(土) 21:22:31.20ID:dL54PN9cM
>>232
それは未知の例外投げてきたライブラリを信用し過ぎ
製品ならそういう「たぶん大丈夫っしょw」的なのは許されないね
234デフォルトの名無しさん (ワッチョイ ffcf-HxQs)
2024/02/10(土) 22:40:34.32ID:0f3gz8pL0
>>233
逆だろ。catchしないのはライブらにが未知の例外を投げてこないだろうと信用してるってことだろ。
235デフォルトの名無しさん (ワッチョイ bf27-tai3)
2024/02/10(土) 23:44:13.35ID:iRyhZExm0
>>234
catchしないということは終了させるということ
見かけ上動き続けたらいいってもんじゃない
236デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/11(日) 03:08:09.08ID:4PD3HqyC0
>>232
それは未知の例外投げてきた原因を調査しなさすぎ
製品ならそういう「たぶん大丈夫っしょw」的なのは許されないね

>>233
ドキュメント通りに例外発生条件にならないように呼んでやったのに
例外を飛ばしてくるライブラリって一体……
製品やぞ……
237デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/11(日) 03:16:41.24ID:4PD3HqyC0
質問なのですが
Q1. std::ldexp(0.0, 0.0) が0.0なのですがこれは 0^0 = 0という大胆な主張なのですが何で決まっているの?
STLがIEEE735に従っているだけ?

Q2. 最小の(絶対値が最小の正の)非正規化数は
const auto min_expn = std::numeric_limits<double>::min_exponent;
const auto digits = std::numeric_limits<double>::digits;
として、std::ldexp(0.5, min_expn - digits + 1) で正しい?
(実際 std::ldexp(0.5, min_expn - digits + 1) > 0.0 やが std::ldexp(0.5, min_expn - digits + 1) / 2.0 == 0.0 であっる

Q3.にもかかわらず、
std::ldexp(0.5, min_expn - digits) > 0.0 になるのはなんで……orz
238デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/11(日) 03:25:12.56ID:4PD3HqyC0
訂正 |||。n_
誤1: IEEE735
正1: IEEE754
誤2: 非正規化数
正2: 非正規数
239デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/11(日) 06:22:40.58ID:2tL2xZqD0
>>237
wandboxに書いてみ
240はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f740-Kvqi)
2024/02/11(日) 07:55:26.62ID:nHqSm2on0
>>237
決まっていない。言語仕様としては未規定。
std::numeric_limits::is_iec559 が真であるならその挙動をあてにしていいがそうでないときは各環境の事情による。
241デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 09:19:29.20ID:XOPhWcHA0
>>236
あんたの認識じゃ catchする=見かけ上動き続ける なんだ?
なんか根本的に勘違いしてる気がする。
242デフォルトの名無しさん (ワッチョイ 637c-IqbK)
2024/02/11(日) 09:29:04.38ID:9XvrSVak0
例外は「関数外にエラー発生を伝える」ための「方法の一つ」でしかない
関数の処理がどんなエラーを発生させうるか、受け取った外側の処理がその情報をどう取り扱うべきかという問題とは完全に直交してる
(言語ごとにある程度の慣例はあるけどあくまで慣例)

例外に変なこだわりや的外れな批判をしてる奴は大体そこを勘違いしてる
243デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 09:47:48.61ID:XOPhWcHA0
アンカ間違えた、すまん
>>241>>235宛な。
244デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/11(日) 09:47:48.79ID:2tL2xZqD0
>>242
お前はバグのないお花畑を考えてるからそういう理想的な抽象論を持ち出すんだよ
c++の現実は道を踏み外したら即カオス
stlのコンテナのpopに返り値がない理由は知ってるか?
あのレベルの考察でソフトウェア設計している人間が世の中にどれだけいると思う?
245デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/11(日) 09:55:44.37ID:2tL2xZqD0
>>241
>>169を否定している
知らない例外が飛んできた場合にcatchして握りつぶしてそのまま動作を継続するかどうかって話な
246デフォルトの名無しさん (ワッチョイ 637c-IqbK)
2024/02/11(日) 10:07:06.72ID:9XvrSVak0
>>244
バグのあるなしなんか関係ない設計の話だし、「例外はエラー伝達の具体的方法の一つ」って話のどこが抽象的なのかも分からないし、
「C++の現実」とか「カオス」が具体的に何のことで何の関係があるかも分からないし
STLにpopがないのはnoexcept moveがない時代に例外安全に出来なかったからだけど今の話に何の関係があるかわからないし
そんなのまともなC++erなら誰だって考えて設計してると思うけど、そうでないタコの話が何の関係あるかわからないし何もかも分からなすぎてすごい
仕事でそんなドキュメントやレビューコメント出すなよ

>>245
知らない例外を握り潰すのも、知らない戻り値をガン無視するのも一緒
errnoが変わってるのを無視するのもint*err引数に渡した変数の値を無視するのもexpected<T,E>で帰ってきたEを無視するのも「知らんエラーを無視した」という結果は一緒
知らんエラーを無視していいかどうかの意味論と、そのエラーがどう伝播して来るかかは関係ない
関係ない話を混ぜるからお前のC++はカオスなんだよ
247デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 10:14:56.00ID:XOPhWcHA0
>>245

そのtryブロックの処理が失敗したものとするって書いてあるじゃん。
248デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/11(日) 11:18:37.96ID:4PD3HqyC0
>>231
>前半のよくわからない計算はcatch句を書いたらそのC0網羅のためのテストケースが必要になるとかいうことなんだろうか
例外が関数の階層をぶち抜いてfall-throughしてくることを忘れている発言
1. catchが書かれた関数が正しくcatchし、適切に処理するか(処理してせき止め or/and 必要な場合再スロー)(←要テスト!
2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト!

2をテストもせずに放置するとおかしくなる例は>>183のとうーり
これにより、例外を生じる関数foo()の呼び出しパティーンn個それぞれに対し、a個のテストが必要になっる
例外を発生させない使い方をするなら、n*a*mではなくmの定数倍(例外を飛ばさない使い方に依存擦る定数)。
例外が飛んで来たらバグ。わかりやすい

例外を多用しつつn*a*mをよくわからない計算とか言っている時点で以下略
249デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/11(日) 11:18:50.45ID:4PD3HqyC0
>>244
以下の主張のどこが抽象論なのかkwsk、
1. ライブラリのドキュメントに従い、可能な限り例外を生じない使い方で設計する(>>236
2. 例外が生じない前提としたところは例外が生じないことをテストする(m個のオーダー)(>>229
3. 1と2の過程で意図に反して飛んでくる例外がある場合は原因を調査し、修正を試みる(>>228 例外が飛んで来たらバグ
4. 3を意図通りの形で解決できないことが判明した場合は
  (ライブラリの使用方法の当方の誤解、ライブラリのドキュメントの不備、ライブラリの作りの粗さによりこれはあり得る、
  結果的にtry { } catch (/*省略*/) { ... }を付ける可能性もある(>>228
5. 例外を複数段fall-throughか再スローを許し、かつそれが起きた後もプログラムの
  正常な動作の継続を意図する場合はテストケースが爆発する(>>

設計し、検証し、必要とあらばtry { } catch ( ) の追加も含めた修正を行うと言っているのやぞ;;;

いっぽう藻前らの主張は
1. 例外をせき止めれば良い(←処理不能な未知の例外が飛んでくることが無いというライブラリに対する全幅の信頼
2. 例外を処理したりfall-throughしたり再スローしたりする関数はn*a*m個のテストしなくても動くっしょ
 (←自己のコードに対する無制限の気体
3. ドキュメントは100%信頼せず、読まない
の3成分からなるわけやが……
250デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 12:01:58.52ID:XOPhWcHA0
>>248
>例外が関数の階層をぶち抜いてfall-throughしてくることを忘れている発言

やっぱり意味不明だな。catchすれば「階層をぶち抜いて」ってことはないわけだが。

>2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト!

もしそのテストが必要なんだとすれば、catchしない場合はその例外が通過する
呼び出し階層全部でテストをしなきゃならないってことになるが。
251デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 12:31:22.40ID:XOPhWcHA0
>>249
>1. 例外をせき止めれば良い(←処理不能な未知の例外が飛んでくることが無いというライブラリに対する全幅の信頼

なるほどな。
catchする⇒無視する、握りつぶす って脳内変換されてんだな。

catch書いたからといって上に挙げられたようなテストができなくなるわけじゃないっしょ。必要と思うならやればいい。

3.の意図しない例外の原因調査なんて main() に例外が上がってきてプログラムが落ちてからより
発生個所に近い下層で catch できた方がはるかに調査しやすいと思うんだがな。感覚が違うなあ。
252デフォルトの名無しさん (スプッッ Sd52-oDfP)
2024/02/11(日) 12:37:47.91ID:AyRTgUB7d
仕様書や規格書はその意図を正確に読み取ろうとするのに
掲示板の他人の書き込みは積極的に曲解しようとするのは何故か?
253デフォルトの名無しさん (ワッチョイ ef8b-u/MX)
2024/02/11(日) 12:44:06.42ID:E8bU9+6D0
見下しているからよ
こいつらは俺より下なはずと
254デフォルトの名無しさん (ワッチョイ 5eda-5kwM)
2024/02/12(月) 07:49:39.70ID:4SfsXRB60
本気で面白いと思ってやってんだろう
255デフォルトの名無しさん (ワッチョイ 637c-IqbK)
2024/02/12(月) 08:44:56.68ID:WngRm50l0
例外は糞!危険!意味不明!テスト漏れる!って言ってる奴ほど
if (err != 0) { return -1; }が大好きなんだよな
本質的にやってること変わらないのに
256デフォルトの名無しさん (ワッチョイ eba6-IqbK)
2024/02/12(月) 15:42:15.86ID:NdUIQhSh0
ファイル名に年月が使えないの困ります。
2024/02/11_データ.txt
とか
257デフォルトの名無しさん (ワッチョイ 4b5a-nvep)
2024/02/12(月) 15:46:00.47ID:QicyHe7E0
>>256
それ検索性最悪だから良くないんだよなぁ。
データ/2024/02/11/データ.txt
データ.txt/2024/02/11/データ.txt
あたりならまだ許せる。
258デフォルトの名無しさん (ワッチョイ 6fac-ND3n)
2024/02/12(月) 16:40:43.94ID:MdmHk5EH0
ふつう年月日はハイフンで区切るよね
259はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6332-A7R9)
2024/02/12(月) 17:02:03.84ID:4VueJhli0
スラッシュを使う習慣が悪いわけではないが
プログラマの感覚だと ISO 8601 の方式に馴染みが有ることが多いってのはある。
260デフォルトの名無しさん (ワッチョイ 5edc-s3Gl)
2024/02/12(月) 17:31:20.60ID:rGOG+Ewu0
年月日は「ふつう」がないのでみんなが苦労している
日本とアメリカとイギリスで順番が違うし
日本には「令和」とかあるし
261デフォルトの名無しさん (ワッチョイ f78f-nOVH)
2024/02/12(月) 18:43:50.33ID:zGvIVge80
Windowsでも / をディレクトリ区切り文字として使えるけど(場面は限定的かもしれないけど)、その認識で使ってるのかな…
262はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6332-Kvqi)
2024/02/12(月) 20:07:00.91ID:4VueJhli0
Linux で * という名前のファイルを消そうとして
うわあぁぁぁとなった話はたまに聞く。
使えたとしても使うべきでない文字もある。
263デフォルトの名無しさん (ワッチョイ f7cb-nOVH)
2024/02/12(月) 21:44:07.99ID:zGvIVge80
262>>
それ以外のファイルをすべて退避した上でディレクトリごと削除したことがあったな
264デフォルトの名無しさん (ワッチョイ f7cb-nOVH)
2024/02/12(月) 21:46:10.68ID:zGvIVge80
すみません、261ですが、Windows限定の話ではなかったですね
失礼しました…
265デフォルトの名無しさん (ワッチョイ 5edc-s3Gl)
2024/02/13(火) 05:53:49.07ID:QIUviIGO0
Linuxならi-nodeをしていすれば
findと組み合わせてどんな名前のファイルも消去できるんだけどなあ

windowsはなんか複雑だったような気がした
266デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/13(火) 09:36:03.89ID:7CLA20rP0
iso8901にしない人はたぶんこの規格を知らないわけで意識低すぎだろと思ってしまう
267はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6332-A7R9)
2024/02/13(火) 11:18:57.32ID:T85IlqBy0
>>266
ISO 8901 は情報交換用 (要するに機械同士のやり取り) の時刻フォーマットを定める規格であって
言葉や文章で使うもの (人間が読み書きする目的) ではないと適用範囲の言及がある。
ファイル名はどちらの用途もありうるので >>256 がどのような状況を想定しているかによって
ISO 8901 が適切かどうかは違う。

もし非技術者向けのシステムなら
文化固有の日付表現に対応できてないほうが意識低いという見方もある。
268デフォルトの名無しさん (ワッチョイ 5ed7-nvep)
2024/02/13(火) 12:55:27.90ID:c63MYIIQ0
>>267
エンドユーザーの文化的背景に配慮したデータフォーマットの利点は、エンドユーザーの知識やメタファーを利用した学習曲線の低勾配化であって、技術的には負の遺産になりやすいことには注意が必要。

典型的には小組織から始まるURLの並びですな。木構造との相性がひどく悪い。
あるいは大きな桁から始まるバイト列とか。あんなの1桁目から始めればエンディアン問題とか無かった。
269デフォルトの名無しさん (ワッチョイ 12ad-v2JO)
2024/02/13(火) 13:07:38.28ID:mTl8FNrx0
> 典型的には小組織から始まるURLの並びですな。木構造との相性がひどく悪い。
それは人間から見たときと機械から見たときの見やすさの違いでしかないような気がする

でも日本の住所は大きい方から始まるんだよな
アメリカは個人から始まる
文化の違いやけども、日本人は機械生命体だったのかもしれぬ
270デフォルトの名無しさん (ワッチョイ 6b74-e92p)
2024/02/15(木) 04:22:25.92ID:MOgQCM5N0
>>58
亀だがクロスで使ってるよ
271デフォルトの名無しさん (ワッチョイ d62e-RfGy)
2024/02/16(金) 22:41:08.10ID:/bcZ41DF0
enable_shared_from_thisなクラスで、shared_from_this()はコンストラクタの中では
呼べないようですね
コンストラクタの中の処理でthisを渡したい処理があるのですが、どうしたら...
そもそもそれ自体が間違っているのでしょうか
コンストラクタが呼ばれる行の次でその処理を呼べばいいという説もありますが、
現在のコードがそれをやりにくい形になっていて
272デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/17(土) 11:55:24.05ID:hsYxYbKj0
>>250
>>2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト!
>もしそのテストが必要なんだとすれば、catchしない場合はその例外が通過する
>呼び出し階層全部でテストをしなきゃならないってことになるが。
その通り。テスト不要としたいなら、例外が出た原因を調べて出ないようにするのが筋

原因を調査して対策せずに予防的にテスト不十分のtry { } catch () をてんこ盛りにする方がソフトウェアー品質が上がるという考えのはおかしい

>>251
>catchする⇒無視する、握りつぶす って脳内変換
脳内変換ではなくて、予防的に入れたtry { } catch ()部分のテストが不十分な限り事実じゃーん?

>>252
>本質的にやってること変わらないのに
別に。
return -1; は呼び出し側のバグで見落とすかもしれないが
throw std::logic_error("*** ERR ***"); なら悪評千里を走ってバグの兆候が嫌でもワカル
むしろ予防的なtry { } catch () が例外のメリットをreturn -1; に縮小してゐる
273デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/17(土) 12:01:54.73ID:hsYxYbKj0
>>253
藻前が二の句をつげないのは藻前の見識と資質の問題であって
漏れの責任ではないのでお間違えなきよう、
なのですよ……
274デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
2024/02/17(土) 12:35:51.03ID:mUyTgSzm0
テストって想定した動作環境、データ入力に対して想定した動作をするか確認をするわけで
想定しえないエラーや割り込みに対してはテストのしようがないんだけどな
そのための例外処理だろ
275デフォルトの名無しさん (ワッチョイ 6332-A7R9)
2024/02/17(土) 13:04:42.05ID:4+T7+QKn0
例外が上がってくるってことはどこかで例外を投げてるってことだぞ。
問題が起きたところでその問題に対して例外を投げるという対処をしてる箇所がある。
想定してないなら例外送出すらできないよ。

その上で人間は大きいプログラムの全体を把握することは困難だし
機械的なチェックがしづらいという現実はあるって話だ。
276デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
2024/02/17(土) 13:33:26.89ID:mUyTgSzm0
アプリケーションを作っているのとOSを作っている人は別
それと同様に利用するライブラリがどのような例外を投げてくるか、もしくはそのライブラリがさらに下位のライブラリから投げられた例外をどう処理しているか
アプリケーション開発者はそれらすべて想定できているとでも?
ハードウェアやシステム含めて全部ひとりで作り上げる(もしくは密に情報共有できている)ならお前の言う通りだけどな
277デフォルトの名無しさん (ワッチョイ 6332-A7R9)
2024/02/17(土) 13:41:06.46ID:4+T7+QKn0
>>276
「把握することは困難」という現実の話もしてる。
想定してはいて、しかしそれが伝わってない。
コミュニケーションの問題、自動化の問題として捉えるべき。
278デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
2024/02/17(土) 13:56:12.85ID:mUyTgSzm0
俺も、(もしくは密に情報共有できている)なら、と言う話をしているがな

ただ「現実の話」と言うならば、伝わっていないことをコミュニケーションの問題、自動化の問題と言うのはナンセンスだわな

お前自身がこう言っている
> その上で人間は大きいプログラムの全体を把握することは困難だし
> 機械的なチェックがしづらいという現実はあるって話だ。

ではWindowsと言う巨大プログラムにおいてMSの中の人はどの程度全体を把握していて、発生しうる例外を公開しているのか
アプリケーション開発者はその公開情報をもとに *想定し* プログラムを組まなくてはならない
さてアプリケーション開発者はOSなど下位のモジュールから飛んでくる例外をすべて想定できるのか?

そもそも致命的な例外でアプリケーション自身の継続が困難な場合を除いて
どんな例外でもあっても継続的な処理を可能にするのが例外処理だろうに
(ここで言う継続的な処理とは問題なしとして先に進むだけでなく、異常があったとして正常な(処理の)出発点に戻るという意味でもある)
起こりえる例外をすべて想定せずともプログラムを安全に継続するための仕組みが例外処理だろ
279デフォルトの名無しさん (ワッチョイ 6332-A7R9)
2024/02/17(土) 15:09:15.47ID:4+T7+QKn0
C++ の設計理念としては「そうは言っても現実はこうなっとるやろが!」という
状況に対処する方法があることも大事にしてはいる。 たとえ綺麗な方法ではなくても。

どのような問題が起こりうるのか (それなりには) きちんと想定するのは当然の大前提で、
それでもこれからリリースするソフトウェアに何が起こるかわからんのは仕方がないという話であって、
想定が不十分でも構わないという話でもない。
よくは無いが悪いときでもなんとかなるという程度の仕組みだよ。
280デフォルトの名無しさん (ワッチョイ e33b-hZ+C)
2024/02/17(土) 15:39:40.77ID:snTd9S980
>>271
一番いいのはコンストラクタの中でthisを渡す部分を何とかすることだけど、それが必ずしも間違ってるかは分からないので
コンストラクタの中だけでその処理が呼ばれるなら生のthisを渡すことを許容しつつ、その処理の呼び出し可能範囲を限定するか
そのクラスの構築をファクトリ関数経由に限定して、ファクトリ関数の中に構築とその処理呼び出しをまとめてしまうとか
281デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
2024/02/17(土) 15:49:12.98ID:mUyTgSzm0
> 想定が不十分でも構わないという話でもない。
誰もそれで構わないとは言っていないので
それでも起きてしまうエラーや割り込みに対応するための仕組みが例外処理だろ

身も蓋もない言い方をするなら
そもそも想定できているなら事前に排除するだけで済むわけで例外処理の必要もない
(もちろん分かっていても事前に排除せず意図的に例外処理に丸投げすることもあるのは知っている)
アプリケーション開発者にとってもっとも想定できない問題ってのは実行環境に起因するもの
282デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/17(土) 20:37:07.00ID:QSMcEn770
>>272
>原因を調査して対策せずに予防的にテスト不十分のtry { } catch () をてんこ盛りにする方がソフトウェアー品質が上がるという考えのはおかしい

相変わらずずれてるな。 catch する == 原因を調査しない じゃないわけ。

>return -1; は呼び出し側のバグで見落とすかもしれないが
>throw std::logic_error("*** ERR ***"); なら悪評千里を走ってバグの兆候が嫌でもワカル

戻り値のチェック漏れは静的局所的にチェックできるが例外は出てみなけりゃ結局澪とされるわけだが。

リリース後にユーザーサイドでその見落とされていた例外が発生してプログラムが落ちたりしたらそれはただのバグ。
283デフォルトの名無しさん (ワッチョイ 1e85-XyAm)
2024/02/17(土) 23:18:00.46ID:v62CV0mD0
>>278
> そもそも致命的な例外でアプリケーション自身の継続が困難な場合を除いて
> どんな例外でもあっても継続的な処理を可能にするのが例外処理だろうに

それは幻想
c++の例外安全の達成がどれだけ難しいか理解していないね
簡単にリークするし、オブジェクトが想定外の状態を持ったりする
動作保証ができない
だから仕様に明示されていない例外が来たら基本は終了だよ
そのまま継続してそれが原因でその後別の場所で落ちられたら無駄な調査の手間が増えるだけ
284デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/17(土) 23:48:07.59ID:QSMcEn770
例外安全と例外の種類には特に関係はないわけで、知らない例外だと例外安全の保証が困難になるなんてこともない。
285デフォルトの名無しさん (ワッチョイ 6fbc-ERL4)
2024/02/18(日) 00:24:49.13ID:JX7gxI3D0
>>284
例外の種類しか頭にないのか
任意の場所での例外発生に対応するなん現実的にできないということ
286デフォルトの名無しさん (ワッチョイ ffe0-UH2C)
2024/02/18(日) 09:00:09.02ID:c1Urupub0
>>269
そのあたりの難しさを考えると、例外廃止してoptionalに統一したほうがいいかもな。
少なくとも例外みたいに変なフローで飛んで来ないし。
287デフォルトの名無しさん (ワッチョイ e3f9-NGC7)
2024/02/18(日) 09:39:44.00ID:9f8IS57r0
ぶっちゃけ>>283がなに言ってるのかわからない

継続してそれが原因で?
いやいやw
突如落ちるより、保存できるデータは保存してもらう機会を与えることは出来るだろ
なんでお前は何事もなかったかのように作業を続ける前提でしか話を聞かないんだ?
オブジェクトの状態が変わっているかも?
変更前のデータと比較して変わっていたらユーザに確認すればいいだろ
例えば図形情報のうちTopの読み込みで例外が発生した場合に想定してないからとアプリ落として全情報ロストさせる気か?
Topは0で初期化させ読み込めなかったことをユーザに伝えて修正、もしくは再読み込みの機会を与えるだけの話だろ
288デフォルトの名無しさん (ワッチョイ cfcf-sYtR)
2024/02/18(日) 09:41:50.12ID:WHoJTRhT0
>>285
>例外の種類しか頭にないのか

>>283が仕様に明示されていない例外を話題にしているからだが。

>任意の場所での例外発生に対応するなん現実的にできないということ

これはどういう意味なんだろうな。
着目するのは自分が呼び出している処理から上がってくる例外に対して例外安全かどうかであって
それは基本的に局所的に判断できるもの。
下層の、例外が通過してきた処理が例外安全な実装になっているかどうかってのはそっちの責務。
289デフォルトの名無しさん (ワッチョイ e3f9-NGC7)
2024/02/18(日) 12:27:32.99ID:9f8IS57r0
> これはどういう意味なんだろうな。
そうそれ

tryブロックで囲った部分(つまり任意)の例外発生に対応するのが例外処理なのになにが出来ないというのか
想定している例外が発生して継続できると判断したなら続ければいいし
ダメならユーザに通知してもちょも安全な方法を選択させればいい
でもってそれは想定していない例外の発生でも同じ
ただ致命的でどうしようもないなら強制終了させるだけの話で、想定していない例外はなんでもかんでも強制終了じゃ例外処理使う意味が薄まってしまう
290デフォルトの名無しさん (ワッチョイ e3f9-NGC7)
2024/02/18(日) 12:28:39.34ID:9f8IS57r0
もちょも は もっとも の まちがい
291デフォルトの名無しさん (ワッチョイ 6f5b-ERL4)
2024/02/18(日) 13:22:22.19ID:JX7gxI3D0
>>287
ファイル保存するなとか言ってない
それぐらい終了処理のひとつだろ
ログファイルもシグナルトラップして必ずフラッシュさせるのが常套手段だろ

意味不明な例外が発生しました
データが破損してないかあなたが確認してください
動作無保証ですが処理継続しますか?yes/no

こんなUIだすやつセンスの欠片もない
292デフォルトの名無しさん (ワッチョイ e304-hmqi)
2024/02/18(日) 14:01:41.78ID:6Yt/CDIt0
私が20代の頃に見かけた論争が今も繰り返されてるのかわいい🩷
293デフォルトの名無しさん (ワッチョイ ffad-mJpf)
2024/02/18(日) 15:55:07.22ID:1iQutSwY0
>>291
それを思いついたお前のセンスがないと言うことになるが…
俺は確認しろと言っただけだし確認には様々な方法がある
294デフォルトの名無しさん (ワッチョイ cfcf-sYtR)
2024/02/18(日) 16:26:47.97ID:WHoJTRhT0
>>291
まさか、何も言わずにいきなり落とす方が良いとか言うわけじゃあるまい。
295デフォルトの名無しさん (スッップ Sd1f-p9fr)
2024/02/18(日) 17:54:38.27ID:L2mk1x1ad
>>289
もちょカワイイよね
296デフォルトの名無しさん (ワッチョイ bf9a-/DPD)
2024/02/18(日) 18:17:37.55ID:LeQ06zof0
>>280
実生活のあれと似てますよね。「引っ越すことになりました。新住所はXXです」と早めに
連絡したら、気の早い知人がそこに押しかけてきて「なんやまだ引越しとらんやんけ」となる
やはり引越し作業完了を待ってからの方がいいのか。ってちがうか
297デフォルトの名無しさん (ワッチョイ 1b63-9XlH)
2024/03/02(土) 23:41:07.84ID:C77pR/Zl0
>>282
>相変わらずずれてるな。 catch する == 原因を調査しない じゃないわけ
>249に賛同いただけていないということは、発生してもいない例外について予防的にtry { } catch () を入れようとしていることは
確定的に明らか

で、例外というブツは「例外なく」悪い知らせなので(∵仮に良い知らせを例外で寄越すライブラリがあったらそれ自体悪い知らせである
普通の人は悪い知らせが来る前に処置しようとする。すわなち例外が来ないように(可能な限り)修正する。
try { } catch ( ) でひっかけて原因調査兼確実な修正でざい、それが一番効率が良い方法論である、などと主張するのはおかしい人だけ……
298デフォルトの名無しさん (ワッチョイ 1b63-9XlH)
2024/03/02(土) 23:49:37.41ID:C77pR/Zl0
>>284
例外安全というもののスコープに対して考察が足りていない

1.
例外安全なオブジェクト foo のデストラクトが他の例外によって引き起こされるケースでは
foo の安全な終了は(メモリかファイルステムか何かが物理的にぶち壊れてOSがパニックになったとかでない限り
ほぼほぼ保たれるから>>284のような言い方はできるっていやーできるが、
システム全体については>>283の通りであって全然安全ではない

2.
fooの中の例外処理が本当に完璧かはfooのコードに書かれている全てのtry { } catch () について
全ての例外発生条件についてテストか厳格めのコードレビューでも行わないことには安全性が担保されない。
(つまり例外安全にした実装したと主張するだけでは話がただちには簡単にはならない
299デフォルトの名無しさん (ワッチョイ 1b63-9XlH)
2024/03/02(土) 23:57:46.67ID:C77pR/Zl0
それはそうとして、予防的なtry{ } catch () の何が一番駄目かというと、設計上のトレードオフをわけわかんなくすることが確実な点

例外発生後の状況というのはたいてい>>283の通りのわけなので、何かを捨てて何かを取る
(例えばシステムは最悪落ちても構わないが、例外安全なオブジェクトfooでリソースAの整合性は死守する等)
のトレードオフが発生するがそういうのこそ慎重な設計と考慮が必要な事項であることは確定的にあきらか
プログラムの全階層にtry { } catch ()入れたら完璧などというアフォはやっぱtry { } catch () しないのが正しい
300デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8)
2024/03/03(日) 21:57:15.41ID:735dldsp0
>>298
自分が呼び出す関数が例外安全にできているかどうかと自分の処理が例外安全かどうかをごっちゃにしてるだろ。
しかも、呼び出す関数からドキュメント化されていない想定外の例外が発生するなら例外安全に作られていないだろうという
変な決めつけが混じってる。
例外安全なコードは例外の種類に依存しない。知ってる冷害に対しては安全だけど知らない例外が飛んできたら安全じゃない
なんてのはそもそも例外安全とは言わない。
301デフォルトの名無しさん (ワッチョイ ef0a-qSkN)
2024/03/03(日) 22:08:48.84ID:qMaLplcd0
>>300
お前さ、すべてのnoexcept関数呼び出しの例外テスト書いてんのか?
それが出来もしない理想論だって言ってんの
302デフォルトの名無しさん (ワッチョイ 3b7c-85wQ)
2024/03/03(日) 22:31:19.01ID:GdJ/jhkt0
>>301
自分でnoexcept指定した関数のことなら投げないことを確認するテストくらい書けよ当たり前だろ
303デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8)
2024/03/04(月) 00:08:35.31ID:gWJ01aQ50
>お前さ、すべてのnoexcept関数呼び出しの例外テスト書いてんのか?

悪魔の証明をテストすんのか
304デフォルトの名無しさん (ワッチョイ ef0a-qSkN)
2024/03/04(月) 07:57:02.63ID:D3yk9beu0
>>302
100%自分で書いてるコードなら未知の例外なんて起こらんだろ
話の筋理解してからレスつけろや三流
305デフォルトの名無しさん (ワッチョイ 8b63-eOBD)
2024/03/04(月) 07:58:21.27ID:KYG2Ugpe0
なんか予想外に低レなレスポンスを寄越した>>299……
さすがに>>283の後に>>284のような楽天的なことを言えるだけのことはあるということか……

例外安全は確かに目指すべき境地であり、例外安全なオブジェクトだけでコードを書けば
その関数は例外安全となる。try { } catch ()など一切不要、となるわけで一見実現が簡単に思える
が、例外安全なオブジェクトだけかをもれなく機械的に確認する方法は無い上に、
中断したら別物になる(処理の順序が命)というアルゴリズムというものの本質的特性により、
>>183 のような try { } catch () が必要なケースは隙あらば混ざり込んでくるから(※1)
>>284が空想するようなシステム全体の例外安全化などは現実には不可能。
せいぜいある程度の規模のオブジェクトであれば、十分テストすれば
(自分が呼び出す関数が例外安全にできているかどうかと自分の処理が例外安全かどうかを慎重に確認せねばならない)
ほぼほぼの信頼度で実現できるというぐらい。
306デフォルトの名無しさん (ワッチョイ 8b63-eOBD)
2024/03/04(月) 07:59:55.02ID:KYG2Ugpe0
(※1) >>183 の関数そのものは、例外安全なスレッドオブジェクトでも使ったらtry { } catch () 無しの例外安全な関数うに書き直すことはできうる
307デフォルトの名無しさん (ワッチョイ 8b63-eOBD)
2024/03/04(月) 08:09:49.95ID:KYG2Ugpe0
あと寝てて思ったがプロセスが死んでもサービスが継続したらお客様には迷惑を掛けずに済むので
(直接そういうのをやってちるわけではないので強くは言わんが
 ウォッチドッグタイマー的な死活監視で異常あらばプロセス再起動とかマシンを切り替えるとか方法はいくつもあって、
 十分テストされたプログラムならクラッシュ頻度をポアソン分布とみなして信頼度も出せる
やっぱ「お客様の前で落ちたら恥ずかしいから」というつまらないプライドを基本的動機とする
try {
  ....
} catch (std::exception& e) {
  log_e("std::exceptionがスローされました");
};
みたいなコードをリリースコードに含めましょうという>>282の調査のスタンスは全く正当化されない
100日に一回しか再現しないバグの修正を3日でやれと言われて手元にあるのがメモリダンプの代わりに上の23文字のログメッセージだけだったりしたら
>>282は自○が真剣に考慮すべき選択肢に……
308デフォルトの名無しさん (ワッチョイ 9fad-ZLJX)
2024/03/04(月) 08:50:22.67ID:MzjtGtOW0
> なんか予想外に低レなレスポンスを寄越した>>299……

299はお前自身じゃないのか、と俺は思う
309デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8)
2024/03/04(月) 08:53:34.53ID:gWJ01aQ50
>例外安全は確かに目指すべき境地であり、例外安全なオブジェクトだけでコードを書けば
>その関数は例外安全となる。try { } catch ()など一切不要、となるわけで一見実現が簡単に思える

例外安全だからといってcatchが不要になるわけないだろ。
根本的なところで勘違いしてるから頓珍漢が主張を続けてるわけだな。
310デフォルトの名無しさん (ワッチョイ abe4-XE6S)
2024/03/04(月) 10:20:12.57ID:QvxlWFfk0
例外安全には基本保証・強い保証・no-fail保証がある
例外がスローされない関数を作ればno-fail保証がある
基本保証や強い保証は例外発生後も不整合が発生しないもの

たとえば例外が発生した関数をもう一度呼び出すと「すでに実行中です」とエラーを返すようなものは例外安全ではない(おそらく実行中フラグ変数が立ったままになっている)
311デフォルトの名無しさん (ワッチョイ abe4-XE6S)
2024/03/04(月) 10:23:14.03ID:QvxlWFfk0
10行のデータをファイルに出力するとき、例外が発生して5行だけデータが出力されてしまうのは強い保証があるとはいえない
例外が発生した際にデータを書き込む前のファイル状態に戻れば強い保証がある(例外安全である)といえる
312はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b32-hL5K)
2024/03/04(月) 12:10:26.04ID:ASLjljy+0
誤解のないように念のため補足。
この場合の「強い」という用語は性質の分類であって強いことがより良いというわけではないという話をしてる。(んだよね?)
例外を出さずに済むならそれに越したことはないよ。
でも、ひとつの部品の中では問題を解決できないことがあるからこそ例外を用いて他の部品と連携しての解決を試みるわけ。
連携するには保証の強力さよりも保証範囲の明瞭さ (明瞭でもカバーしようがない設計はあかんが) が大事で、プログラム全体で整合性が保たれていれば例外安全と言える。
仕様が不明瞭なライブラリもあるのが現実だってのはそりゃそうだけど、出来が悪い部品とつじつま合わせをしきらないってのは例外のせいでも C++ のせいでもない。
313デフォルトの名無しさん (ワッチョイ f7f0-B2uz)
2024/04/08(月) 15:38:53.52ID:IvxniXPw0
std::initializer_listについて質問です
下の例ですがコンストラクタの引数に配列リテラルを指定した場合、リストがコピーされてしまいますよね?
これは無駄なので回避したいのですが良い方法はありますか?

https://cpprefjp.github.io/reference/initializer_list/initializer_list.html
314デフォルトの名無しさん (ワッチョイ df01-g9Lk)
2024/04/09(火) 12:13:11.96ID:gepNgOiE0
どこのコピー?
315デフォルトの名無しさん (ブーイモ MM3e-Nnmc)
2024/04/09(火) 12:52:21.68ID:80QuF/MqM
リテラルのコピーを気にするならconstexprじゃねーの?
ほんとにコンパイル時に定数になるかは知らんけど
316デフォルトの名無しさん (ワッチョイ 7b32-B3tP)
2024/04/09(火) 15:22:07.81ID:hsAXyuRl0
>>313
C++ に配列リテラルはない。
その書き方で出てくる波括弧はリスト初期化の構文の一部で、
波括弧の部分単体は配列リテラルではない。

実行時にオブジェクトの構築を避けるならコンパイル時に構築することになるが
それはそれで色々と制約があるんでほんまにそれが必要なんか?
というのはよく考えないといけない。

あえてやるならこんな感じかな……。
https://wandbox.org/permlink/HStrLq8ddyC3tby2
317デフォルトの名無しさん (ワッチョイ c3c9-hAMa)
2024/04/09(火) 20:10:25.18ID:T/amOWJO0
とあるtemplateの関数を実装しているのですが、
const指定の振る舞いがよくわからなくなったので
質問させてください。

以下の(だいぶ簡略化した)コードで、
f_without_const<const int*>(const int* a)
はコンパイルが通るのですが
f_with_const<int*>(const int* a)
がコンパイルが通らないのは何故でしょうか。

https://wandbox.org/permlink/OIgKM2DTqvpGduRV
318デフォルトの名無しさん (ワッチョイ f7f0-B2uz)
2024/04/09(火) 20:30:45.76ID:lDhzon+/0
>>316
なるほど
ここまでやるメリットはなさそうなので大人しくデフォルトの書き方にしておきます
319デフォルトの名無しさん (ワッチョイ 2790-Bmwq)
2024/04/09(火) 21:45:08.71ID:+RmfoJzl0
>>317
templateは型が違うと全くの別物として処理するからだと思う
320デフォルトの名無しさん (ワッチョイ 7b10-qE2a)
2024/04/09(火) 22:00:45.26ID:5hAg3cgl0
>>317
template <class T> void f_with_const (const T t);
これに対応させるなら f_with_const<int*>(int *const a)
321はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7b32-B3tP)
2024/04/10(水) 08:39:45.44ID:Fk7YBwaR0
const T t に対して const int* a が来たら
字句の順序としては T に int* が対応してるように見えちゃうもんな……。
322デフォルトの名無しさん (ワッチョイ c37a-hAMa)
2024/04/11(木) 21:42:31.84ID:0cjrPM+u0
317です、返信遅くなってすみません
確かに言われてみればconstが修飾してるのはint*なので、意味的にint *constが正しいですね…
ありがとうございました
323デフォルトの名無しさん (ワッチョイ b77c-0iQt)
2024/04/14(日) 14:49:11.63ID:tTNkn9kB0
先月東京で標準化委員会の会議あったらしいけどなんか情報ないの?
324デフォルトの名無しさん (ワッチョイ ff33-m4LK)
2024/04/14(日) 15:03:51.38ID:H7y3imqp0
あるよ。 https://github.com/cplusplus/papers/issues?q=sort%3Aupdated-desc
325デフォルトの名無しさん (ワッチョイ 7f52-9wFU)
2024/04/16(火) 00:50:18.09ID:38VQ+8UT0
>>323
https://www.reddit.com/r/cpp/comments/1bloatw/202403_tokyo_iso_c_committee_trip_report_third/
326デフォルトの名無しさん (ワッチョイ 67b1-Jq5A)
2024/05/01(水) 21:36:46.68ID:/DCu7vsT0
python みたいに何でも格納できる辞書型ってC++には無いよね?
327はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8732-nVjz)
2024/05/01(水) 22:29:05.62ID:IV4TsWNk0
>>326
要素を std::any にすればだいたいどんな型の値でも入れられる。
いろんな型を入れたところで使うときには元の型として取り出さないといけないから
処理は煩雑になってあまり良いことはないけど。
328デフォルトの名無しさん (ワッチョイ 8f7c-Y/5H)
2024/05/09(木) 20:23:09.67ID:MzADiHDk0
https://cpprefjp.github.io/lang/cpp23/add_support_for_preprocessing_directives_elifdef_and_elifndef.html
#elifって今まで非標準だったのかよ…
329デフォルトの名無しさん (ワッチョイ bed6-w0ma)
2024/05/09(木) 21:19:14.71ID:M6C6+6vz0
何いってんだ
330デフォルトの名無しさん (ワッチョイ bbda-JG92)
2024/05/10(金) 11:53:06.45ID:P+BretyD0
#elifは大昔からあるぞ
331デフォルトの名無しさん (ワッチョイ 8f7c-Y/5H)
2024/05/11(土) 09:12:25.64ID:YR9R4Y390
cpprefjpが間違ってるだけ?
それともずっと規格から欠落してたけど誰も気付いてなかったパターン?
332デフォルトの名無しさん (ワッチョイ bed6-w0ma)
2024/05/11(土) 11:19:25.57ID:PrWZroBw0
規格が読めないならC++やめろ
333デフォルトの名無しさん (ワッチョイ 0b63-IWIS)
2024/05/11(土) 19:02:18.20ID:RotYKdRC0
elifを逆から読んだらfile
ラリーはこれを嫌ってPerlではelsifにした(適当
334デフォルトの名無しさん (ワッチョイ bbda-JG92)
2024/05/11(土) 22:20:47.67ID:HBPowvO20
シェルが変だからな
case ~ esac
if ~ fi
335 警備員[Lv.23] (ワッチョイ 1563-WQ8n)
2024/06/06(木) 07:08:30.09ID:Glzej5210
てst
336 警備員[Lv.23] (ワッチョイ 1563-WQ8n)
2024/06/06(木) 07:55:41.85ID:Glzej5210
質問なのですが
Q1. std::fstreamでファイルを開くときのフラグの指定の仕方は次のどれが正義?
 std::fstream ofs("foo.txt", std::ios::out | std::ios::binary); // (1)
 std::fstream ofs("foo.txt", std::basic_ios::out | std::basic_ios::binary); // (2)
 std::fstream ofs("foo.txt", std::fstream::out | std::fstream::binary); // (3)
337デフォルトの名無しさん (ブーイモ MMde-FHn0)
2024/06/06(木) 15:53:22.90ID:Vp529NVwM
フル手書き前提がくそださい
338デフォルトの名無しさん (ワッチョイ fe2c-7W3t)
2024/06/06(木) 19:13:19.37ID:FMMlTunO0
fstreamなんだったらfstreamのメンバで書くのがいいんじゃない
339 警備員[Lv.23] (ワッチョイ 1563-WQ8n)
2024/06/06(木) 23:36:07.51ID:Glzej5210
(1)は#include <ios>が要るし、
(2)は「basic_」の6文字×フラグの数 だけ長いし、
(3)も同様でありなおかつ>>337に従ったとき
 use binary = std::fstream::binary;
 use ibinary = std::ifstream::binary;
 use obinary = std::ofstream::binary;
となってしまい、
どれもこれもコード量最小化原則的にビミョーなことに……

ていうかなんで同じことをするのに複数の書き方があるのかっていうか、
Perlじゃあるまいし……
340デフォルトの名無しさん (ワッチョイ d68d-vvKF)
2024/06/06(木) 23:54:13.70ID:7ZzCG2hU0
iostreamはまあしゃーない…
341デフォルトの名無しさん (ワッチョイ a97c-3xqL)
2024/06/07(金) 02:20:24.96ID:GhXFHGen0
C++の悪評の4割くらいはiostreamのせいだからな
342デフォルトの名無しさん (ワッチョイ a944-l7CW)
2024/06/07(金) 04:24:11.05ID:qf+nnTv50
ここでCmakeとNinjaについて聞くのダメ?
どーも関係がよくわからなくて?
343はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-zlCG)
2024/06/07(金) 05:26:04.94ID:zM43Xr/H0
>>342
そういう雑多な話題のちょうどよいスレは見当たらんし、単発で終わる質問程度なら許容されると思うが……。
質問の内容が漠然としているなら丁寧な回答は得られないと思う。
「よくわからない」という状況になるときってのは大抵の場合に関連する前提知識が足りてないので
質問が連鎖的に発生してダラダラ続いたりするから。
344はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-zlCG)
2024/06/07(金) 05:36:24.41ID:zM43Xr/H0
>>336
第四の選択肢
std::fstream ofs("foo.txt", ofs.out | ofs.binary);
345デフォルトの名無しさん (ワッチョイ fee5-FHn0)
2024/06/07(金) 13:37:29.47ID:kav19u0f0
copilotで補完でok
346デフォルトの名無しさん (ワッチョイ 6af0-AYul)
2024/06/07(金) 17:07:58.06ID:NFmVQMC40
バカの解決策
347デフォルトの名無しさん (ブーイモ MMea-FHn0)
2024/06/07(金) 21:12:45.28ID:70o6R+hDM
また時代に取り残されるじじい
348デフォルトの名無しさん (ワッチョイ 1563-WQ8n)
2024/06/07(金) 21:48:19.45ID:ORLoeNdF0
>>344
ofsのスコープの隙間を突きなおかつ静的メンバをドット演算子で参照する等
テクニカルですばらっし
349デフォルトの名無しさん (ワッチョイ fee5-FHn0)
2024/06/08(土) 01:03:51.86ID:k3Jnk/Aj0
静的解析で文句言われる可能性あるからやめときな
頻発するならスニペット作ればいいだけ
そういう表面的なことにこだわる奴は三流
350デフォルトの名無しさん (ワッチョイ f344-7AaF)
2024/06/09(日) 04:26:59.39ID:RJYm8+UN0
lldb v14.0.0 で正しくプロセスを実行できません
apt insrall でインストールしたもので, 環境はwsl 1 です
具体的には下のサイトのIssue Encountered:と全く同じ症状です
https://stackoverflow.com/questions/78275920/troubleshoot-lldb-on-ubuntu-wsl

改めて書きますと Hello World 表示だけのソースを clang でコンパイルし,
lldb で読み込み run させると

Process 20784 launched: '/home/Hustler/c++/move/move' (x86_64)

と表示されたまま応答がなくなり 放置すると(サイトでは強制終了させてるようですが)

Process 20784 exited with status = -1 (0xffffffff) lost connection
となってコマンド入力待ち状態となります

ちなみにプログラムはそのまま実行して正しく動作しますし gdb でも何の問題もありません
これに関して何か情報をお持ちの方いますか?
351デフォルトの名無しさん (ワッチョイ f344-7AaF)
2024/06/09(日) 05:11:57.08ID:RJYm8+UN0
今やってみたのですが
lldb-14をuninstall(remove)し lldb-15をインストールしてみましたが
状況は改善しませんでした
352はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f332-Oh5j)
2024/06/09(日) 15:07:14.43ID:bthWHIYm0
WSL1 は (ある程度) Linux 互換のシステムコールを windows 内に実装することで実現していて Linux カーネルそのものではないので色々と不足がある。
(そのかわり Windows と親和性がある部分もある。)
WSL1 で用意してない Linux の機能に依存したアプリケーションは動かない。
まともな互換性が必要ならWSL2 を使いなさいという話なので手間をかけて WSL1 を積極的にはサポートしないと思う。
353デフォルトの名無しさん (ワッチョイ f344-7AaF)
2024/06/09(日) 20:56:05.63ID:RJYm8+UN0
>>352
wsl2 ではlldbは問題なく動いてるんですか?
古いCPUなのでwsl2がインスコできないもんで
上のサイトはwslのバージョンは書いてなかったようですし
354デフォルトの名無しさん (ワッチョイ 6363-vt9G)
2024/06/09(日) 21:14:14.41ID:VES2dE5O0
WSLはlldbが使うシステムコールが足りてないって昔から言われていたかと

ターゲット機を別にするとかWSL2にするとかじゃね?
355デフォルトの名無しさん (ワッチョイ f344-7AaF)
2024/06/09(日) 21:36:35.88ID:RJYm8+UN0
>>354
>WSLはlldbが使うシステムコールが足りてないって昔から言われていたかと

なるほどTHXです
clang使ってなかったので全然わかりませんでした
動かないlldbもさんざんggったんだけど system call未実装にはたどり着けませんでした
ようやくすっきりしました
356はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f332-Oh5j)
2024/06/09(日) 22:04:05.34ID:bthWHIYm0
ざっとググってみた感じたと wsl1 では procfs が提供する情報が少ないのが lldb が動かない直接の原因みたいな数年前の情報は見つかる。
内部構造がまるで違うはずなのに表面的なインターフェースは互換にするなんてのは無理のある話なので互換性が「ある程度」にとどまるのは仕方ない。
357デフォルトの名無しさん (ワッチョイ f344-7AaF)
2024/06/09(日) 22:18:48.29ID:RJYm8+UN0
んー
clangちょっと調べたかったんで
Visual Studioにclangインスコして調べますわ
できるならwslでやるのが手っ取り早いんですが
Q9550とQ9550sしか持ってないもんで
以来CPUの爆値上がりと最近の円の爆下がりで新しく組めてないんですわ
ダイサイズ変わらないのにCPU 3万ー> 10万とか購買意欲が萎える
358デフォルトの名無しさん (ブーイモ MM1f-vt9G)
2024/06/10(月) 18:15:47.68ID:bkv2YMA2M
>>355
github のwslのissueを漁れば出て来るかと。
結論がWSL2使えだったかと
359350 (ワッチョイ f344-7AaF)
2024/06/10(月) 21:38:00.71ID:gvR5xwnw0
自己レスです
その後 Visual Studioのインストールオプションでclangを選択し
正しく動作することは確認したのですが...

今や誰でもロハで使えるインテルコンパイラがとっくの昔にllvm化されてたんですね
clangに拘りがなければ x86/x64のwin/linux/wsl は素直にopenAPI使っとくのが幸せかも.
ちなみにwsl 1にlinux版をインストールしましたが
コンパイラicxもデバッガgdb-opwnapiも何の問題もなく動いてます(今のところは)
なので
Visual Studio はインストールオプションのclang は外してもとに戻し
wsl は
>apt remove clang clang-15
>apt remove lldb lldb-15
しときました
360350 (ワッチョイ f344-7AaF)
2024/06/11(火) 06:20:17.73ID:Ip4/j3Hv0
☓ openAPI
◯ oneAPI
361あぼーん
NGNG
あぼーん
362あぼーん
NGNG
あぼーん
363デフォルトの名無しさん (ワッチョイ 43d7-pk1M)
2024/07/13(土) 19:06:26.39ID:Dtkl2SPB0
若者のBoost離れ
364デフォルトの名無しさん (ワッチョイ 0501-twcF)
2024/07/13(土) 19:56:34.01ID:vwgbCsGD0
と言いますと?
365デフォルトの名無しさん (ワッチョイ f5f9-pk1M)
2024/07/13(土) 21:42:42.00ID:Rh1MnFN10
VS17.10.xでBoostがビルドできなくなってるのに
誰も触れない
366デフォルトの名無しさん (ワッチョイ f5f9-pk1M)
2024/07/13(土) 21:47:29.39ID:Rh1MnFN10
MSVC143から144に変わったせいでビルドできないらしいですよ
367デフォルトの名無しさん (ワッチョイ e91c-hIhh)
2024/07/16(火) 12:22:56.57ID:gS8T2k/f0
>>342
CMakeとNinjaはC++の話題なのでOKです
368デフォルトの名無しさん (ワッチョイ 4901-V77j)
2024/07/27(土) 17:57:44.53ID:KDd62vAV0
C++、
型の指定が、めんどい

速いぐらいしか、利点ないよな
369デフォルトの名無しさん (ワッチョイ 7b95-4q6c)
2024/07/27(土) 20:53:02.50ID:eNksZtKQ0
顧客目線に立てない三流の感想
370デフォルトの名無しさん (ワッチョイ 4901-7phL)
2024/07/27(土) 21:03:15.66ID:zOSUCWw50
>>368
auto使えば?
371デフォルトの名無しさん (ワッチョイ 1379-xel+)
2024/07/27(土) 23:40:34.69ID:iHlVB6Tw0
ランタイムに依存しない(し難い)のが最大の利点だろうに
さらに大抵のアーキテクチャには用意されてるからクロスプラットフォームの観点でもなんだかんだ最強なんだよ
むしろ最近はChatGPTが他の言語で書いたやつまで適当に書き直してくれるのもあって最強度がより高まってきてると感じるね
372デフォルトの名無しさん (ワッチョイ 8e95-N8l3)
2024/07/28(日) 00:00:39.51ID:ePI6t8jD0
全く同意できんな
むしろ環境依存上等で使うのがC/C++だろ
パッケージシステムも標準がないしビルド環境もばらばら
どこが最強やねん
標準ライブラリで完結するようなしょぼいプログラムなら他の言語使ったほうが楽
373デフォルトの名無しさん (ワッチョイ bdf0-+IYp)
2024/07/28(日) 00:11:55.23ID:4HqkcgMt0
型の指定のサンプル
GetProcAddressに変換をかけるマクロ
#define ENTRY_INTERFACE(api) api = (decltype(api)) GetProcAddress(hInst,"_INTERFACE_"#api)
ね?簡単でしょ?
374デフォルトの名無しさん (ワッチョイ 5d01-viEi)
2024/07/28(日) 12:00:20.72ID:x9q80Pnt0
>>370


auto
オートね
(いいこと聞いた
375デフォルトの名無しさん (ワッチョイ aa3e-cE1m)
2024/07/28(日) 17:36:32.24ID:9wLF96CX0
>>374
あとテンプレートを使ったダックタイプとかも便利。
376デフォルトの名無しさん (オッペケ Sr05-viEi)
2024/07/28(日) 21:14:24.07ID:roXukc4Cr
>>375

ふむ

実践的な(アプリを作るとか)、c++、書籍かなんか、おすすめ、ありますか?


cmake、とかの、関門もあるのだが
(githubにあがってるやつを、きっちり理解したい)
377デフォルトの名無しさん (ワッチョイ 4132-nuT0)
2024/07/29(月) 08:53:31.23ID:cQQT2a1I0
実践に入る前に言語の入門は読んだほうが良いと思う。
基礎を積まずに実践しようとするのは無謀。
378デフォルトの名無しさん (ワッチョイ 9a05-pVLH)
2024/07/29(月) 15:25:34.30ID:heyNGOtI0
なんでも、まずは改造から入るんだぜ

こうですか、うんたぶんこう
379デフォルトの名無しさん (ワッチョイ 4132-nuT0)
2024/07/29(月) 19:25:02.89ID:cQQT2a1I0
C++ には未規定がやたらたくさんあるんだ。
実際の挙動から仕様を想像しようとすると意味不明でグダグダやねん。
380デフォルトの名無しさん (ブーイモ MM9a-N8l3)
2024/07/29(月) 20:07:37.15ID:Nl7D5VelM
ネットでいくらでも勉強できるだろ
書籍なんかいらん
381デフォルトの名無しさん (ワッチョイ aa3e-cE1m)
2024/07/29(月) 20:36:26.35ID:9/o4+28+0
結局ライブラリが重要だから、作りたいアプリで流行っているライブラリの入門をやるのがいい。

作りたいアプリそのものじゃなくても、類似アプリを作るのはやる気に繋がる。
382デフォルトの名無しさん (オッペケ Sr05-viEi)
2024/07/29(月) 22:02:41.02ID:8hMQwTW/r
>>377

github にあがってるやつを、理解しようとして、助けになる本は、結局ない希ガス

実際、実践的なものがないので、文法理解で終わってしまうという

https://github.com/TadaoYamaoka/cmajiang

これ、再利用して、アプリを作りたいのだが
383デフォルトの名無しさん (ワッチョイ 4132-nuT0)
2024/07/29(月) 22:18:19.65ID:cQQT2a1I0
>>382
言いたいことがわからん。
auto すら知らんかったということは文法もまだ十分に理解してないってことだろ?
文法が分かったら読めばいいだけなんだから何の本が必要なんだ?
384デフォルトの名無しさん (ワッチョイ 0168-qw7+)
2024/07/29(月) 23:36:56.61ID:7XbSB18u0
>>382
立直麻雀のシミュレーターなら mjx の方がいいんじゃないかな?
マイクロソフトで麻雀 AI Suphx の開発に携わってた人が作ったシミュレーターで
動作検証も天鳳の牌譜で実施したらしい

https://github.com/mjx-project/mjx

他のシミュレーターだと
- libriichi (Rust製 麻雀 AI Mortal に付属 天鳳ルール準拠 AGPL)
https://github.com/Equim-chan/Mortal

- kanachan.simulation (C++製 麻雀AI kanachan に付属 雀魂ルール準拠 MITL)
https://github.com/Cryolite/kanachan/tree/v2

とかも参考になると思う


作りたいアプリの内容がわからないけど

ネット麻雀を作りたいなら cmajiang の元ネタの電脳麻将
https://github.com/kobalab/Majiang
https://kobalab.net/majiang/

AI 用の対戦シミュレーターなら mjai.app
https://github.com/smly/mjai.app
https://mjai.app/

が参考になりそう
385デフォルトの名無しさん (ワッチョイ 0168-qw7+)
2024/07/29(月) 23:43:38.11ID:7XbSB18u0
>>382
書くのを忘れてた
cmajiang の元ネタ majiang-core は作者が解説本を出してる
実際買ってみたけど、やっぱりソースコードだけ読むより分かりやすい

https://www.shuwasystem.co.jp/book/9784798067889.html

ブログでも解説されてるけど、お目当ての記事を探すのが大変だし本の方が見やすいと思った

https://blog.kobalab.net/
386デフォルトの名無しさん (ワッチョイ bdf0-+IYp)
2024/07/30(火) 12:23:26.36ID:8UDCP+we0
>>379
未規定というか、C++11よりも古い規格のは、古参でないと扱いが難しいからね
そういう古い規格のものが仕事で入ってい来たりすると新人は頭悩ますかもしれんね
03~11まで結構間に空いてるしね
387デフォルトの名無しさん (ワッチョイ 5d01-viEi)
2024/07/30(火) 23:52:38.43ID:KT8SFJ0h0
>>385


はい、
すべて、既読です


make,
pybind11

とか入ってて、
デバッグビルド、わかりませんorz
388デフォルトの名無しさん (ワッチョイ 1bef-BWtz)
2024/08/04(日) 06:24:46.59ID:WlfSsbJh0
ラムダ式が渡された側って、キャプチャの内容をチェックしたりできないのでしょうか。

例えば以下の例で、funcA()の中でfの中のthisをチェックして挙動を変えたりとか?
そういうことをしたいなら、ラムダの引数で渡したりすべきでしょうか?

#include <iostream>
class A {
public:
 void funcA(const std::function<void(int)>& f, int a) {
  f(a); // can I check 'this' (B class) in f?
 };
};
class B {
public:
 void print(int b) {
  A objA;
  objA.funcA([this](int i) { std::cout << "val = " << i << "\n"; }, b);
 }
};
int main(void) {
 B objB;
 objB.print(2);
}
389はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-NesV)
2024/08/04(日) 10:12:57.69ID:w7HjtqNP0
>>388
キャプチャした変数はラムダ式の中で使う以外の方法ではアクセスできない。
どのような方法で解決すべきかはそれをしようとする意図によるのでなんとも言えない。
390デフォルトの名無しさん (ワッチョイ a94a-ImVy)
2024/08/04(日) 14:50:32.12ID:ao1w9dwD0
それはラムダ式を使う理由とズレてるな
A側で判定が必要なものならラムダ式の引数もしくはfuncAの引数で渡すべき

A側は受け取るものを「intをひとつ受け取ってvoidを出力する関数」として抽象化してるんだから、それ以外のことは知れないし、知るべきではない
Aは渡された関数が何であろうとintを一つ渡すだけで、その詳細 (関数がどのような値や参照をキャプチャしてるのか、渡した引数がどのように使われるのか) には触れられない
ラムダ式を使うのはこのような抽象化が目的のはずだから、キャプチャした値を知りたいというのは用途から外れるかと思う
391デフォルトの名無しさん (ワッチョイ 9b72-3sGu)
2024/08/04(日) 18:55:04.35ID:knGBcNlu0
なんか最近自分でで適切なインターフェースを定義して使うって発想がなくなってる気がする
ひたすらありものを繋ぐだけで作り切るみたいな
392デフォルトの名無しさん (ワッチョイ c1f0-3TXu)
2024/08/04(日) 19:21:38.37ID:oxQURbTu0
仕組みを追求することをせずにどっかから完成した㌬をドッキングするだけの作業は情報収集力さえあれば組み込み系の作業員でもできるし己のチカラにはならんのよな
で、いろんなもの付け合わせていった結果、とんでもない容量のものが出来上がる上におまえそれメンテとかどうするんだよって方向に走ってって…あとは想像のとおりに
393デフォルトの名無しさん (ブーイモ MM8b-3sGu)
2024/08/04(日) 19:54:18.08ID:wSg2UiB1M
オブジェクト指向オワコン論からの風潮
394デフォルトの名無しさん (ワッチョイ 1320-cRFB)
2024/08/04(日) 21:00:47.00ID:YVKn/U480
なんでオワコンなの?
395デフォルトの名無しさん (ワッチョイ c1f0-3TXu)
2024/08/06(火) 01:29:43.68ID:DDRjgUjC0
全然関係ないよな
取って貼っ付ける行為とオブジェクト指向は
全体の概要設計を把握してメンテ出来ていれば何の問題もない
396青木康善 (ワッチョイ 59d4-ANSA)
2024/08/07(水) 04:36:25.01ID:S6qXQ6lv0
素晴らしいなあみなさん。早すぎる!C plus plusは!
397デフォルトの名無しさん (ワッチョイ 5347-eg/E)
2024/08/07(水) 09:54:05.95ID:+pgWMXtY0
JavaはCの20倍速いを知らん人か
398デフォルトの名無しさん (アウアウエー Sa23-LX2u)
2024/08/07(水) 17:07:58.21ID:RPpAsXPKa
>>391-392
チェンジニアをチェンジ
>>395
オブジェクト指向でもクラスライブラリを造る側とただ使う側では理解度に雲泥の差がある
399青木康善 (ワッチョイ 0bc8-ANSA)
2024/08/08(木) 00:15:58.93ID:Qfze0mfg0
マジっすか?Cの20倍?しかし、専門学校の先生に、青木!バカもん!プログラミング言語Cが一冊で事足りる、と言われても、高校数学でつまづいて大鬱病になったんで、問題が解けない。。。有隣堂本店さんで、リッチーの本置いているから、いつか買います!
400デフォルトの名無しさん (ワッチョイ 31fe-/5UW)
2024/08/08(木) 04:05:43.03ID:G3QDAupS0
今のANSI対応版は易しくなってると思うけどな。
不安ならアンサーブックとセットで買えば良いベ
401デフォルトの名無しさん (ブーイモ MM33-DGdp)
2024/08/08(木) 16:07:46.41ID:fgfi2g+JM
VMのオーバーヘッドがあるのに20倍って?
あるいは20倍時間が掛かる?
402青木康善 (ワッチョイ 31e4-ANSA)
2024/08/09(金) 13:02:28.92ID:FZEpuz0a0
いや、プログミング言語は、駿台電子は、国語の倒置法なんです。夜間の一年で、javaからで、二年でCなんです。いや、アンサーブックは、池袋ジュンク堂本店さんには、置いてなかったような。。。。。ありがたいというか、ビックリ。。。。マジか。。。機械語を仕事でプログラミングしていた先生が、喫煙所で、青木、お前、一つのことを本当に深く考えたことがあるか?と質問してくれた恩師なんです。
403デフォルトの名無しさん (ワッチョイ 5384-eg/E)
2024/08/10(土) 12:16:45.89ID:xFKQiXk00
スカイネットの誕生日
404デフォルトの名無しさん (スフッ Sd33-QylA)
2024/08/10(土) 23:52:09.93ID:oQf4NdPPd
御巣鷹山ノボレ
405デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 08:35:54.88ID:yYuYqoCz0
すみません。教えて下さい。
template<class T, class U>void (T& x, const U& y)
{
x=y;
...
}
double ←complex<double> の代入がコンパイルエラーとなるconceptの書き方あるんでしょうか?
complex<double> ← doubleの代入ではエラーが出てほしくないです。
406デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 09:05:25.59ID:yYuYqoCz0
あ、上では関数名fが抜けてましたね.concept使わずとも
template<class T> void f(complex<T>& x, const T& y)とすればいいでしょうけど、
y=xのときはどうかとか、あるいは complex<double>←float の代入はokにしたいとか、
いろいろ考えているとテンプレート関数なのに関数のオーバーロードが増えてしまって面倒だなと思ったものですから。
407デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 09:23:02.26ID:yYuYqoCz0
y=xのときは忘れてください。(f(complex<T>& y, const T& x)とすればいいだけ)。どういう状況のためにconceptが必要なのか要点がまとまっていませんね。失礼しました。
408デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 09:53:34.49ID:PPcTgFGr0
conceptで無理やりくくるよりか、static_assertのほうが楽そう
template<class T, class U>void f(T& x, const U& y)
{
static_assert(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value,"絶対にゆるさない!絶対ニダ!!");
x=y;
...
}
409デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 11:11:32.60ID:yYuYqoCz0
&& は右辺値参照ではなくてandの意味なんですね。std::is_same<double,T>はdouble型とT型が一致するかどうかを調べるヘルパー変数テンプレート、::value は trueかfalseのいずれかの値をとる定数ですか。static_assertは自分でエラーメッセージを作れるのがいいですね。完全にわかっていないですが、勉強します。ヒントありがとうございました。
410デフォルトの名無しさん (ワッチョイ 1f23-dwWB)
2024/08/24(土) 11:44:22.45ID:6PXbzil00
最近、初心者にいきなり右辺値参照とかテンプレート教える風潮は良くないと思うんだよなぁ・・・論理andとごっちゃになってるやんけ

ともあれis_same自体は構造体で、中にあるvalueは定数値やで
変数テンプレートはis_same_vの方。利便性(::value書くのがめんどい)のために用意されてるだけ
static_assertの第一引数(bool)に条件式を与えてるんだが、間違ってる

static_assert(!(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value),"絶対にゆるさない!絶対ニダ!!");
411デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 12:20:38.61ID:PPcTgFGr0
!抜けてたわ
スマソ
412デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 12:40:45.95ID:PPcTgFGr0
// こういう書き方もある
if const_expr ( std::is_same<double,T>::value && std::is_same<complex<T>,U>::value ) {
//許されない処理
static_assert(false,"許さんぞ!!");
}else {
//正常処理
}
413デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 12:43:11.34ID:PPcTgFGr0
また間違えたw
× const_expr
● constexpr
414デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 14:40:14.03ID:yYuYqoCz0
いろいろとありがとうございます。参考になりました。
template<class T, class U> void f(T& x, U& y)
{
if constexpr ( !(std::is_same<T,double>::value &&
std::is_same<U, std::complex<T>>::value) ) static_assert(false,"ワシャ許さんぞ!!");
y=x;
}
template <class T, class U> void g(T& x, U& y)
{
static_assert( (std::is_same<T,double>::value && std::is_same<U, std::complex<T>>::v
alue),"ワシャ許さんぞ!!" );
y=x;
}
int main()
{
using namespace std;
double x=3.14159265358979;
complex<double> z;
f(x,z);
g(z,x); // 順番変えたり、xをfloatにするとエラー
cout<<z<<endl;
しかし、コンパイル時にifがつかえるんですねえ。凄いな、constexpr
415デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 15:09:12.28ID:yYuYqoCz0
std::is_same<T,double>::valueの代わりにstd::same_as<T,double>でも良いみたいですね.
416デフォルトの名無しさん (ワッチョイ 9f63-rdaS)
2024/08/24(土) 16:42:04.52ID:6x2BzwZB0
#ifdef NDEBUG
  /*pass*/
#else
class dbg_complex {
  std::complex<double> m_complex;
public:
  // std::complex<double> のメソッドのうち使うやつ同じシグネチャのメソッドを書き並べ、m_complexに移譲
  ...
private:
  dbg_complex(doble);  // 禁止
};
#define complex dbg_compled
#endif
※ 個人の感想です。
417デフォルトの名無しさん (ワッチョイ 9f63-rdaS)
2024/08/24(土) 16:48:40.66ID:6x2BzwZB0
いちいち移譲せねばならないのはstd::complex<T>の継承が禁止されているためorz
実際デストラクタが十中八九virtualではないし、

>>416の最後の
#define complex dbg_complex
みたいな穴だらけの置換手段が嫌ならもうstd::complex<double> を普段からcomplexdbl という別名にすると決めてまう
すると
#ifdef NDEBUG
using complexdbl = std::complex<double>;
#else
using complexdbl = dbg_complex;
#endif
で済む
 
418デフォルトの名無しさん (ワッチョイ ff67-kHtd)
2024/08/24(土) 18:35:31.16ID:BJpt+Mj00
>>412
これかなり新しめのコンパイラじゃないと動かないので注意
419デフォルトの名無しさん (ワッチョイ 1f23-dwWB)
2024/08/24(土) 19:16:42.78ID:6PXbzil00
行うべき解放処理が無い上ポリモーフィズムも不要なら、別にデストラクタがvirtualである必要は無いぞ
このケースで継承すべきかどうかはまた別として
420デフォルトの名無しさん (ワッチョイ 1fbe-3Zrt)
2024/08/24(土) 23:53:59.32ID:4DIR6G6I0
>>412
constexpr if が使える (= C++17以上) なら std::is_same<T, U>::value よりも std::is_same_v<T, U> を使う方がシンプルだと思う
421デフォルトの名無しさん (ワッチョイ 02f0-HfY5)
2024/08/25(日) 00:16:13.89ID:LfSHCV3h0
ま、お好きなの使えいいんじゃないんすか~
こちとら例文示しているだけで極めているワケじゃないからぬ
422はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4d32-7Uxd)
2024/08/25(日) 01:15:32.96ID:zZ+WMAII0
>>414
テンプレート型引数に require 節などで制約を付けた場合に制約に合致しなければオーバーロード解決候補から除外されるが、 static_assert や if constexpr での判定は解決が終わってテンプレートが実体化されるときに判定される。
つまり、より優先順位の低い候補に当てはめたいかもしれない場合は static_assert や if constexpr での判定をすべきではない。
状況によって使い分けがある。

それと >>418 が注意しているのは、テンプレートはテンプレート引数に依存しない部分は実体化されなくても検証されるルールだから。
(Two phase name lookup について調べてみて。)
つまり static_assert(false, ほにゃらら) と書いてあったらそのテンプレートが使われるかどうかに関係なく問答無用でエラーとして報告されていた。
新しい仕様では static_assert は実体化のときまで検証しないように挙動が改められたのだが、これは欠陥報告の形で問題提起されて過去の仕様に遡って修正されるので C++11 からこの仕様だったことになった。
新しいコンパイラでは C++11 を指定したときでも新しい挙動になる。
423デフォルトの名無しさん (ワッチョイ 0278-RCJX)
2024/08/25(日) 01:34:45.73ID:GxcwnqZY0
まあ、そんな小難しいこと言われても。C++が嫌われる理由だわ
424デフォルトの名無しさん (ワッチョイ 02f0-HfY5)
2024/08/25(日) 02:05:31.18ID:LfSHCV3h0
実体化ってどっちみちコンパイルするときにエラー発生するんだから結果かわらねぇだろバカがよう
425デフォルトの名無しさん (ワッチョイ c5a7-8JDH)
2024/08/25(日) 06:41:14.01ID:n8ainESh0
static_assert(false, "")は何かしらダミーの値入れて回避してたけど修正されてたんだ、知らんかった
426デフォルトの名無しさん (ワッチョイ 02f0-HfY5)
2024/08/26(月) 00:27:52.82ID:JWWBXqLI0
false効かないバカコンパイラはどうしようもないからどうにもならんか
//requires を使った方法
template<class T, class U>
requires(!(std::is_same_v<double,T>&&std::is_same_v<complex<T>,U>))
void f(T& x, const U& y)
{
x=y;
...
}
427デフォルトの名無しさん (ワッチョイ 2963-G6Q9)
2024/08/27(火) 07:16:06.25ID:NdPbjHCm0
特定の引数型についてテンプレート展開を阻止したいんなら
特殊化してその中にstatic_assert(false, "*** ERR ***")書いても昔は駄目だったんか恐ろしい……
428デフォルトの名無しさん (ワッチョイ 2963-G6Q9)
2024/08/27(火) 07:35:09.57ID:NdPbjHCm0
しかしまあ特殊化してテンプレート引数の型Tについて
態と存在しないメソッドを呼ぶように書いたらその特殊化ケースについて展開を阻止できうる(適当
クラス内でint型定数が欲しかったら古き良き enum { ONE, TWO, THREE } で十分やし
同じことをやる手段を増やせば良いってもんじゃないぞPerlじゃあるまいし……
429デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/27(火) 14:55:30.59ID:oHcafaf7a
perlの面白仕様
430デフォルトの名無しさん (ワッチョイ c5f3-8JDH)
2024/08/27(火) 17:14:33.06ID:K2iTXH930
まぁ普通にSFINAEなり=delete指定なりコンセプトなりでオーバーロード候補から外す方が利用者視点でいえば自然だな
431デフォルトの名無しさん (ワッチョイ 0278-RCJX)
2024/08/27(火) 17:33:30.75ID:K7dNHCWQ0
#include <iostream>
#include <complex>

template <class T> decltype(auto) f(T x)
{
decltype(abs(std::declval<T>())) w;
w=abs(x);
return w;
}

int main()
{
using namespace std;

cout<<f(-1) << endl;
cout<<f(2.f)<< endl;

complex<double> z=complex<double>(1.0,1.0);
cout<<f(z)<<endl;

cin.get();
return 0;
}
いちかばちかでやったら、通りました。abs! Who are you? sizeof演算子と同じくコンパイル時に評価されるんですか? というか、地味だけど declval が凄い。
432はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4d32-7Uxd)
2024/08/27(火) 18:27:19.33ID:WfqXHPCU0
>>431
sizeof や decltype のオペランドは評価されないということになってる。
だからその文脈で関数を使う場合でもその関数が定義されている必要はない。 (宣言だけあればよい。)
評価されないけど実体化は起こるのでそのへんの理屈は複雑でよくわからん。
433 ころころ (ワッチョイ 0202-3rb6)
2024/08/30(金) 02:40:03.60ID:qLymVnYK0
decval使ったコード始めてみたかも
434デフォルトの名無しさん (ワッチョイ 0220-Fpn2)
2024/08/30(金) 05:15:18.21ID:ZIPlhev80
相互参照わっかんねぇ
435デフォルトの名無しさん (ワッチョイ 5f2f-+rLF)
2024/09/02(月) 12:36:59.33ID:bqeYsc0k0
相互参照は必要ない
最近はウェブプログラマのほうが賢くなった
すそ野が広がると質が良くなるらしい
436デフォルトの名無しさん (ワッチョイ bf0a-5+wm)
2024/09/02(月) 13:00:06.45ID:Rco2Fp/20
必要ない理由ぐらい言ったら?
437はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e732-CMA8)
2024/09/02(月) 14:42:22.37ID:o+5p2SR60
プログラムの文法要素が相互参照になっている状況という意味?
たとえば前方宣言が必要な場合とか。

それとも (実行時の) データ構造が相互参照ということ?
たとえば循環構造の後始末のやり方がわからんとか。
438デフォルトの名無しさん (ワッチョイ 0701-+rOo)
2024/09/02(月) 19:52:42.06ID:cn5uZ01w0
>>435
その「相互参照」って何?
439デフォルトの名無しさん (アウアウエー Sa1f-XN8b)
2024/09/05(木) 00:06:16.92ID:/oUqYYg3a
相互参照も自己参照も一緒
自己参照なんて参照してるのは自己ではない
ホントの意味での自己参照は循環参照
440デフォルトの名無しさん (ワッチョイ 5f00-+rLF)
2024/09/05(木) 18:17:57.29ID:xTcyjaky0
shared_ptrを使いたくなったら設計を見直すべき
441デフォルトの名無しさん (ワッチョイ 277f-jESi)
2024/09/06(金) 07:27:10.33ID:Qb4sTpDj0
>>440
それは無理があるんじゃないのかね。
データ共有とかインターフェイス共有とか本質的に所有者が複数存在するオブジェクトはsharedptr使うべきかと。

設計ではモジュール間の疎結合・インターフェイスの汎用化を重視すべきで、そのためにはデータの共有方法が重要になる。
442デフォルトの名無しさん (ブーイモ MM7f-5+wm)
2024/09/06(金) 11:54:45.03ID:onD85wsiM
>>440
マルチスレッドセーフ考えたら使わざるを得ない場合は多々ある
言ってる意味がわからないならお前は経験不足
443デフォルトの名無しさん (ワッチョイ e7df-UdSI)
2024/09/06(金) 22:35:55.77ID:0hxwMUxG0
recurcive_mutexが欲しくなったら設計を見直したい、なら分かる気もする
444デフォルトの名無しさん (ワッチョイ 0753-60ma)
2024/09/07(土) 11:45:08.02ID:Zy1zUumM0
C++11あたりから「生ポは使うな」みたいな極論で分かった気になってる思い上がった初心者が増えたからなぁ
445デフォルトの名無しさん (ワッチョイ bfac-jESi)
2024/09/07(土) 11:58:09.00ID:UFsx2JaR0
>>444
生ポ使うよりかスマートポインタの参照を使った方がマシだったりするからなぁ。スマートポインタがスタックフレームにあるなら安全だし。

スタック変数専用仮引数とかあればもっと安全になるのになぁ。
仮引数の種類はもっとあっていいと思う。
446デフォルトの名無しさん (ワッチョイ 27ea-60ma)
2024/09/07(土) 16:26:14.57ID:lSV8lU690
>>445
考え方にもよるだろうけど、確保も解放も所有もしない関数でスマポ受け取る必要あるか?
特定の用途で管理されている特定のポインタしか許容しない、という意図ならスマポの参照でもいいだろうけど、汎用性は無いよね
生ポ受け取る場合暗黙のキャストも効かないし
447デフォルトの名無しさん (ワッチョイ 8763-0xUn)
2024/09/07(土) 20:17:38.39ID:Ci+xhqlU0
>>442
むしろshared_ptr<T>でスレッド間共有オブジェクトを保持するのは
生ポに対するshared_ptr<T>のメリットが無い……
可能な限りスレッド間共有なんてことはやめてconstオブジェクトのコピーにするのが正義……

>>439
自己参照ではないが前方宣言が必須の例、
class TreeNode;

class TreeNode {
  std::shared_ptr<TreeNode> m_pLeft;
  std::shared_ptr<TreeNode> m_pRight;
public:
  TreeNode();
  ...
};
  
448デフォルトの名無しさん (ワッチョイ 8763-0xUn)
2024/09/07(土) 20:21:44.33ID:Ci+xhqlU0
んまー前方宣言が必須というのは言い杉やったかもしれんorz
TreeNodeみたいなクラスはノード毎にヒープを確保するなんてことはやめて専用のアロケーターを設けて
専用の領域をまとめて確保して、
木全体がいらなくなったら木をトラバースすることなく一気に解放するのが本当やが
その場合m_pLeftやm_pRightにあたるのはポインタではなくて専用の領域(配列)のindexとかにすれば
前方宣言は不要、
449デフォルトの名無しさん (ワッチョイ 27ea-60ma)
2024/09/07(土) 21:38:34.24ID:lSV8lU690
>>442
使わざるを得ないは言い過ぎじゃね
同期取るのにshared_ptrのアトミック保証に依存するしか方法が無いの?
競技プログラマか何かか?
450デフォルトの名無しさん (ワッチョイ 069a-KwgP)
2024/09/08(日) 00:33:39.65ID:vgBqrjWA0
shared_ptrの内部的な参照カウンタとかはともかく
保持しているオブジェクト自体はアトミックでもなんでもないでしょ
ってなんか勘違いしてる?
451デフォルトの名無しさん (ワッチョイ 91ea-IbtD)
2024/09/08(日) 01:27:17.93ID:6Lpw1aoe0
持ってるポインタの指す先のオブジェクトがアトミックになるとか言ってると思ってんの?アホかw
452デフォルトの名無しさん (ワッチョイ b501-I4rH)
2024/09/08(日) 01:32:50.82ID:TMvzCbR60
そこでRustですよ!
453デフォルトの名無しさん (ワッチョイ eaf0-8qrK)
2024/09/08(日) 12:52:42.06ID:Lw7YNDXG0
でたw
布教マソw
454デフォルトの名無しさん (ブーイモ MM0a-bJfQ)
2024/09/10(火) 11:29:59.05ID:v6KS9t6sM
>>447
お前の理解はshared_ptrの一面だけだな
ようするにunique_ptrの延長でしか見てない
shared_ptrがどうしても欲しくなるのは
オブジェクトのリリースタイミングが非決定的であるとき
これは一般的にマルチスレッド環境

お前のTreeNodeの例はそれこそ生ポで実装しても対して苦労しないが
例えば動的可変multi producerなqueueの場合確実に安全なqueueの解放タイミングを知るにはリファレンスカウントのような制御が必要となる
当然この場合コピーすれば安全なんて寝ぼけたことにはならない
455デフォルトの名無しさん (アウアウエー Sa52-t/33)
2024/09/10(火) 13:20:49.36ID:KGjTz1X0a
x 対して
456デフォルトの名無しさん (ワッチョイ 8a48-/VPw)
2024/09/10(火) 15:36:50.97ID:+l9ylb2n0
それで自己参照ってのは結局何のことを指して言っていたんだい
457デフォルトの名無しさん (ワッチョイ 8a48-/VPw)
2024/09/10(火) 15:39:03.70ID:+l9ylb2n0
あ、相互参照が先か
>>435>>436の言うところの
458デフォルトの名無しさん (ワッチョイ 1ede-2PHd)
2024/09/11(水) 12:14:54.12ID:n6/LwjNL0
(*this)

自己参照
459デフォルトの名無しさん (ワッチョイ 1ede-2PHd)
2024/09/11(水) 12:19:01.05ID:n6/LwjNL0
木のノードはstd::vector<>で確保する
と言われて、だよねってなる人はnewもほとんど必要ない
460デフォルトの名無しさん (ワッチョイ 1ede-2PHd)
2024/09/11(水) 12:22:29.60ID:n6/LwjNL0
木の巡回は、巡回方向別にアダプタとしてイテレータを用意することが出来る
良くある行きがかり順のイテレータはスタックを使って作る
461デフォルトの名無しさん (ブーイモ MM45-bJfQ)
2024/09/11(水) 15:12:04.16ID:1n/VD1trM
でvectorの拡張で破綻すんだろ?
462デフォルトの名無しさん (アウアウエー Sa52-t/33)
2024/09/13(金) 16:29:50.66ID:bblj+c3pa
move禁止
463デフォルトの名無しさん (ワッチョイ 5ef4-bJfQ)
2024/09/13(金) 19:59:43.80ID:2C9M8qgO0
move禁止したらvector使えないし
464デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
2024/09/17(火) 12:59:42.12ID:TMGdiCOOa
それならオブジェクトを保持するためのオブジェクトと
moveためだけのインデックスを分けるかな
465デフォルトの名無しさん (ワッチョイ bf84-GITO)
2024/09/17(火) 16:24:30.60ID:DN+X/Cyr0
何がしたい
あほでしょ
466447 (ワッチョイ d763-HdVQ)
2024/09/21(土) 20:05:42.93ID:FUSKAHoo0
何やら集中砲火を浴びている>>442 やが
マルチスレッド状況でshared_ptr<T>を超有効活用できる手が一つあったわ;;;

スレッド間の共有オブジェクトをポインタpで保持する際の問題点は、
そのポインタを知っている複数スレッドの間でpが指すオブジェクト*pへのアクセスを悉く排他制御せなばならない点やが
逆にpを知っているスレッドが任意の時刻につき1つだけなら、オブジェクトのアクセスに対して排他の必要が無い
それでいてスレッドへのデータの受け渡しに関してコピーの手間は減らせる

例:
なんちゃらWorkerスレッドオブジェクトをshared_ptr<Worker>のキューで保持しておく
スレッドfooが使うときWorker1をshared_ptr<Worker>としてpopする(←これは排他が要る
スレッドbarが使うときWorker2をshared_ptr<Worker>としてpopする(←これは排他が要る
...
(スレッドfooやbarはWorker1、2をそれぞれ独占的に使用できる) ←重要
...
スレッドfooが使い終わったWorker1をキューにpushする(←これは排他が要る
スレッドbarが使い終わったWorker2をキューにpushする(←これは排他が要る
467447 (ワッチョイ d763-HdVQ)
2024/09/21(土) 20:13:25.63ID:FUSKAHoo0
ていうか2週間ぐらい前から作っていたやつが今さっき完動すた、
468デフォルトの名無しさん (ワッチョイ d763-HdVQ)
2024/09/21(土) 20:35:47.52ID:FUSKAHoo0
std::vector<TreeNode> nodes;
ならnodesを拡張したとき破綻するかもしれんが(nodeをnodesのindexで管理するならその限りではない
std::vector<std::shared_ptr<TreeNode> > apNodes;
ならapNodesを拡張しても破綻しないYO!(要素の実アドレスは保たれる
469デフォルトの名無しさん (ワッチョイ e37c-C1Jv)
2024/09/22(日) 08:21:05.99ID:e5FZYjui0
それ何のためのshared_ptrなの?unique_ptrでいいというか横からコピーされないようにそうすべきでは
470デフォルトの名無しさん (ワッチョイ 1e52-VArp)
2024/09/25(水) 13:57:54.93ID:N5yN4IuU0
>>466
>>442 を書いたのおれだけど、なんでおれが集中砲火浴びてることになってんだよ
生ポとか意味不明なこといってる>>447は一見してわかるクソレスだろ

おまえはそれ以上のクソレスにクソコード
でもお前の勝ちだ
クソコードに2週間かけた情熱に免じて親切におしえてやるわ

shared_ptrはpに誰かがアクセスしている可能性がある間は決してdeleteされないことを保証できるのが肝
(pの先の排他ではこれは実現できない)

もちろんこれも正しく使わないと保証できない
よくあるミスは知ったかぶって参照カウントを操作しないようにshared_ptrを参照渡しとかにするやつな
その間に絶対deleteされない保証がないならやってはいけない
471デフォルトの名無しさん (ワッチョイ cb41-LUcV)
2024/09/26(木) 03:21:09.01ID:5BtHXQaO0
あーなるほど、一貫してshared_ptrの実体を渡してればそういう保証も出来るのか
自分の場合自前で排他処理や生存保証作ってたけど確かに大きなメリットだね
(オブジェクト内部の排他は別に必要だとしても)
472デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 10:52:52.31ID:R5lWYvWFa
そんなあなたにRust
473デフォルトの名無しさん (ワッチョイ 3224-jZWQ)
2024/09/26(木) 11:26:35.22ID:r0pzUHiv0
>>472
c++コードと混在できるようになってからの話だな。
既存c++を捨てなきゃならんのなら要らん。
474デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 11:37:49.48ID:R5lWYvWFa
もちろんRustをやるにはC++を捨てる覚悟が必要
C++コード(特にテンプレやclass)とは相性最悪
475デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 11:38:22.04ID:R5lWYvWFa
>c++コードと混在できるようになって
Rustについて言うなら
おそらくそんな未来は永久に来ない
476デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 11:39:08.38ID:R5lWYvWFa
誤解の無いように言っておくと
(一部機能に限れば今でも混在出来るけど)
基本的にはC++とは相いれない
477デフォルトの名無しさん (ワッチョイ 77da-jZWQ)
2024/09/26(木) 18:22:32.63ID:sl+cfKHN0
ならc++にRustの機能が取り込まれるのを待つ。

Rustが大人気になったら、さすがに標準委員の連中も初心者・コーダー向けの"Safe c++"をやる気になるだろ。
478はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e332-Pvcq)
2024/09/26(木) 18:52:53.17ID:B+Au+yIB0
>>477
もう Rust を使えばよくない……?
479デフォルトの名無しさん (ワッチョイ 77da-jZWQ)
2024/09/26(木) 19:43:24.82ID:sl+cfKHN0
>>478
>>473だっつうの。

Kotlinみたいなのが欲しいのであって、Clojureみたいなのは要らん。
480はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e332-Pvcq)
2024/09/26(木) 20:25:47.69ID:B+Au+yIB0
>>165
C++ のコードを Rust から呼び出したりするくらいのことは簡単に出来るよ。
たぶん (Java に対する) Kotlin みたいなこととして思い浮かべているようなことは出来る。

Rust がやってるような安全性の保障を自動では受けられない。
当然だが安全ではない (安全性が検証されていない) C++ のコードが Rust から呼び出すことで安全になったりはしない。
大抵の場合に Rust の都合に合わせてラッパーを書くことになる。
481デフォルトの名無しさん (ワッチョイ e39c-jZWQ)
2024/09/27(金) 10:23:27.00ID:n6BA5joS0
>>480
KotlinとJavaみたいにソースコードを混在できるレベルの相互運用性てあったっけ?
Rustとc++では無理だと思うけど。
482デフォルトの名無しさん (ブーイモ MMe3-VArp)
2024/09/27(金) 10:44:00.51ID:02Aq/BhWM
cxxとかあるけど個人的には中途半端だから使わない
普通に共有ライブラリにして呼び出す方が素直で汎用的で良い
483デフォルトの名無しさん (ワッチョイ 5e79-w5sm)
2024/09/27(金) 12:33:43.81ID:6/1p1gGO0
スマートポインターを使うように強制できる機能とかなら必要ないなあ
484デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:51:52.33ID:pgg/4VuRa
>>473 のような未来は永遠に来ない
485デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:54:13.57ID:pgg/4VuRa
>>482
結局Cが正解なんよ
C++のスレで言うのもなんだけど
486デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:54:31.95ID:pgg/4VuRa
>>481
同意
487デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:54:58.40ID:pgg/4VuRa
>>480
嘘つくな
出鱈目言うな
488デフォルトの名無しさん (ワッチョイ e39c-jZWQ)
2024/09/27(金) 17:14:28.28ID:n6BA5joS0
>>483
コーダー向けので考えるなら、スマポ強制は最優先だろ。

生ポインタを(コーダーが)保存できなくするだけでも随分安全になる。あと生ポインタdelete禁止とか。
489デフォルトの名無しさん (ワッチョイ 728c-rNKn)
2024/09/27(金) 18:24:18.27ID:dg7IL8lg0
極限のパフォーマンスは別に要らないから安全にしたいという要件なら GC が既に解決しているし
今更生ポインタを禁止したところで C# や Java と同じ方向性のナニカにしかならんじゃろ
490デフォルトの名無しさん (ワッチョイ 1e02-VArp)
2024/09/27(金) 18:46:28.46ID:EoeiRCVP0
gcがあったらメモリリークしないなんて幻想未だに信じてるとはね
491デフォルトの名無しさん (ワッチョイ a778-KU+G)
2024/09/27(金) 18:59:34.32ID:RwmUzOsi0
リークの話なの?
492デフォルトの名無しさん (ワッチョイ e39c-jZWQ)
2024/09/27(金) 19:07:06.62ID:n6BA5joS0
>>489
ライブラリとかフレームワークを使う側のコーダーと作る側のライブラリアンは性能要件が全然別。

コーダーに対してライブラリアンが「コーダーのコードに極限のパフォーマンスは別に要らないから安全に「させたい」」というのはあるだろ。
493デフォルトの名無しさん (ワッチョイ cb9e-LUcV)
2024/09/27(金) 23:12:04.55ID:cfj6fT7K0
>>492
それならライブラリ側でメモリ周りを隠蔽するような作り方も出来ると思うけど
ユーザー(コーダー)にはインスタンス使わせるけど内部では参照カウントなりスマポなり使ってるみたいな
それですら問題が起きるようならユーザーがクソ
494デフォルトの名無しさん (ワッチョイ e37c-C1Jv)
2024/09/28(土) 10:42:06.28ID:swed/tX60
C++はどんな安全策敷いてもユーザー側がその気になればいくらでもぶち壊せるからね
ライブラリがあんまりそこ頑張っても仕方ない
495デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/28(土) 12:39:39.83ID:gf2/NL3ha
Rustなら壊れないみたいな言い草だな
496デフォルトの名無しさん (ワッチョイ 77ba-vp5J)
2024/09/28(土) 13:06:22.71ID:ZP4SxDa50
C++で書かれたChrome V8エンジンをRustから扱えるRusty V8というライブラリがリリースされたというニュースを見た
メモリ安全性を確保して呼び出しオーバーヘッドもゼロなんだって
ほんとかな?

ただのラッパーじゃないの?
C++側でメモリアクセス違反があれば落ちそうだけど
497デフォルトの名無しさん (ブーイモ MMde-7TYI)
2024/09/28(土) 14:26:57.72ID:yW35cSECM
その手の話はMICROSOFTの新機能ぐらいい思っておけば
腹も立たない
498はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b332-XD+R)
2024/09/30(月) 22:26:30.09ID:JxqgGnHQ0
>>496
Rust の標準ライブラリだって内部は unsafe だらけだぞ。
unsafe は Rust のメモリ安全性検査の例外とする指定で、検査はされないが安全であることはプログラマが保証しないといけない。
ただ、 unsafe な部分を慎重に押し込めて (押し込めるのが正しく出来ていれば) あとは Rust のメモリ安全性検査に頼ることが出来る。

ずっと気を付けなきゃならない C++ よりは面倒ごとを基盤に押し込めたら後は機械が検査してくれるほうがマシという程度の話。
押し込めた中に問題があればそりゃ当然駄目だよ。
499デフォルトの名無しさん (ワッチョイ 6f79-uMZa)
2024/10/01(火) 02:05:59.60ID:J7GPtKrz0
V8エンジンてCVE脆弱性で毎月アップデートの口実にされる迷惑なやつだからさっさとRustで書き直せよ
500デフォルトの名無しさん (オイコラミネオ MMa7-Pc8v)
2024/10/01(火) 15:19:57.32ID:KXGxeTHwM
>>498
>押し込めた中に問題があればそりゃ当然駄目だよ。
当然分かっているだろうが、unsafeの中だけでなく、
それが外側に及ぼす影響にも問題が生じないように作らなければなら
ないが、それにはunsafeとRustの両方に対する深い理解が
必要となるだろうな。
501デフォルトの名無しさん (オイコラミネオ MMa7-Pc8v)
2024/10/01(火) 18:36:21.46ID:al1nAqGBM
>>500
unsafeの中を通過する時には問題ないが、
戻り値などや、連携する他のメソッドなどが
関係した結果、どこかで分かりにくいメモリーエラー
になるようなことも避ける必要が有るが、
それにはかなりRustの内部構造(?)に対する深い知識
と理解が必要となりそうだ。
502デフォルトの名無しさん (ワッチョイ 1fb1-/QnX)
2024/10/17(木) 11:01:19.65ID:P7X9/HPx0
>>422
これ、static_assertだけ修正してもしょうがない気がするんだけどなぁ
他にも実体化しないはずの分岐でチェックされてエラーにされることあるし
まぁ条件式に無理矢理テンプレート入れて回避は出来るけど
503デフォルトの名無しさん (ワッチョイ 2b63-4umj)
2024/10/19(土) 17:30:35.94ID:vb3IsOJN0
>>491
Rustのオブジェクトの所有権管理の強制はコンパイラに従う限りリークしない
(病的な反例があるかどうかは知らん
からリークの話ではないが、GC付き言語で解決という香具師が現れたから
504デフォルトの名無しさん (ワッチョイ 2b63-4umj)
2024/10/19(土) 17:31:10.99ID:vb3IsOJN0
>>490な発言になったんじゃないの
知らんけど
505デフォルトの名無しさん (ワッチョイ 8593-t4Y2)
2024/10/21(月) 07:19:50.64ID:ThoL8xQh0
>>503
RustはRcの循環参照解決できたの?
公式ソースある?
506デフォルトの名無しさん (ワッチョイ 1907-zDHq)
2024/10/21(月) 14:54:46.51ID:WHCxApN50
C++派だが、Rustをもってしても、相互参照みたいなものは、人類には早いらしい
(設計段階で)無理しないこったな。。
507デフォルトの名無しさん (ワッチョイ c60f-zhf3)
2024/10/21(月) 15:57:11.21ID:Hhc6wfX80
そもそも静的解析で解決できる問題か?
508はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d32-zDHq)
2024/10/21(月) 16:03:29.88ID:6JU3cZPt0
循環参照をしたいときに出来ないのも困るしな。
なるべくやらないに越したことはないが、やるなら後始末は人が考えないと仕方ないわ。
509デフォルトの名無しさん (ワッチョイ e963-f5bJ)
2024/10/21(月) 22:48:14.20ID:XvJERuqr0
食事する哲学者の問題……
Rustだと循環参照するコードを書きにくくなっているから
循環参照によるリークとか病的な反例のうちなんじゃないの
知らんけど

ノードNode同士が論理的には循環参照し得るんだけど
その所有権をスーパーバイザ的な配列superArray: Node[]が持っていて、
510デフォルトの名無しさん (ワッチョイ e963-f5bJ)
2024/10/21(月) 22:53:33.76ID:XvJERuqr0
Node間の参照はsuperArrayのindexで済ませるというのもRustではすんなり通してくれな
いんだっけどうだっけ……
Node& node1 = superArray[0];
Node& node2 = superArray[1];
node1.next = 1;
superArray[node1.next].value = 123; // node2.valueに書く

node1.nextがsuperArray[]の添え字範囲内であることを機械的に保証するためにRustはどんな魔法を使ってくれる
のか
511はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d32-zDHq)
2024/10/22(火) 11:28:00.82ID:UXnTPhGj0
>>510
Rust では実行時にチェックされて範囲から外れていたら panic (C/C++ で言うところの abort みたいなもの) する。
https://doc.rust-lang.org/std/ops/trait.Index.html#tymethod.index
C/C++ のように配列がポインタになるということはなく、スライス (C++ で言うところの span みたいなもの) が基本型として組み込まれているので範囲チェック出来る。

コンパイル時に範囲内であることがわかる状況なら最適化で消えることもあるみたいだけど
実行時に外部から入ってくる値に依存することもあるので実行時にチェックしないとどうしようもない。
512デフォルトの名無しさん (ワッチョイ 8901-1CwD)
2024/10/28(月) 13:44:32.71ID:A9ortPvu0
enum、
文字列への変換、

大変すぎて、ビックリした
513デフォルトの名無しさん (ワッチョイ 1901-2Yr6)
2024/10/28(月) 14:06:10.17ID:/lht/Ba/0
俺はenumの機能を拡張するクラスを自分で定義してるな
それで文字列変換も文字列からの変換も出来る
514デフォルトの名無しさん (ワッチョイ 4907-+Yhf)
2024/10/28(月) 15:41:01.09ID:xcgYWtNU0
autogenerated.txt.c みたいなの使うのも手だぞ 急がば回れ
そしてCよりはうまく書ける
515デフォルトの名無しさん (ワッチョイ 8901-1CwD)
2024/10/29(火) 08:22:28.04ID:XRXAB2XQ0
>>514

うーん、どんなもの?それ
516デフォルトの名無しさん (ワッチョイ 4907-+Yhf)
2024/10/29(火) 13:58:12.41ID:WYOK+g300
好きなように書いて、好きなように変換して、途中でincludeする
簡単に書くもよし、ガッチガチにチェックするもよし
517デフォルトの名無しさん (ワッチョイ fb79-fQm0)
2024/10/30(水) 23:11:10.17ID:x0G86HEF0
HAGE(CAUWA1)
HAGE(CAUWA2)
HAGE(CAUWA3)

みたいなテキスト作っといて
手コキストを#includeする手前でHAGEの意味を変えてやるとうまいこと一元化できる
518 警備員[Lv.44] (ワッチョイ 89c3-YFB5)
2024/10/31(木) 00:43:29.18ID:ET2RcGMR0
カウワ?
519デフォルトの名無しさん (ワッチョイ 7b4d-XqAs)
2024/10/31(木) 01:08:33.55ID:gisW4Gdb0
magic_enum教えてやれや
じじいは感度低いから知らんか
520デフォルトの名無しさん (ワッチョイ 4907-+Yhf)
2024/10/31(木) 05:43:35.79ID:J4xtBqBy0
みてきた それが人気の実装か
やりたいこと次第だが、オーバスペック感はある
ちょうどほしかったんなら止めないけどね
521デフォルトの名無しさん (ワッチョイ 1901-2Yr6)
2024/10/31(木) 10:56:16.92ID:++2hP8JV0
横からなるほどー!
__PRETTY_FUNCTION__ / __FUNCSIG__
522デフォルトの名無しさん (ワッチョイ 8901-1CwD)
2024/10/31(木) 15:32:14.58ID:IcW65SaY0
あのー、アメリカグーグルで、検索すれば、良いのがでてきた

日本は、でてこない
これは、やっぱり、レベルなんだろうね
523デフォルトの名無しさん (アウアウエー Sae3-07nO)
2024/11/01(金) 19:53:27.66ID:TgBKHsuNa
>>518
あさひ奈央
524デフォルトの名無しさん (ワッチョイ 1395-VVnD)
2024/11/02(土) 09:17:27.71ID:KpOoS8wa0
>>522
アメリカグーグルって言い方からして頭悪そう
525デフォルトの名無しさん (ワッチョイ 5910-fVPo)
2024/11/05(火) 08:04:39.53ID://VVBUiD0
magic_enumは個数制限がきついんだよな・・256くらいが限度じゃなかったっけ
526青木康善 (アウアウウー Sacd-P7MY)
2024/11/06(水) 17:05:23.05ID:vfgxFq1Ya
c plus plusとjava、電子音楽作成にどっちが向いてるかな?早いのは無論c plus plusだろうけど。
527デフォルトの名無しさん (ワッチョイ 6107-Q1tn)
2024/11/06(水) 17:09:08.31ID:jrSvpMvx0
作成というが、記述したいのか、波形合成したいのか、はたまた生成(AI等)したいのか。。
528デフォルトの名無しさん (ワッチョイ f618-UxC2)
2024/11/06(水) 17:14:36.09ID:P7rcAaD30
なんでjava?
529デフォルトの名無しさん (ワッチョイ a901-jwtj)
2024/11/06(水) 20:06:37.45ID:TrFjb6KE0
>>526
C++ね
記号の入れ方知らないのかな
530青木康善 (アウアウウー Sacd-P7MY)
2024/11/06(水) 20:56:51.96ID:XG1hV+N8a
C soundというのはかつてありましたが。javaでやろうかな。C++は自分にはハードル高すぎます。
531はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f532-Q1tn)
2024/11/06(水) 21:37:08.81ID:O6Mhx+Gj0
相談スレなんだから相談しなさいよ。
独り言を書きたいなら X で。
532デフォルトの名無しさん (オッペケ Sr79-Q1tn)
2024/11/06(水) 22:48:47.88ID:tlKINjNQr
5ちゃん初めてなんでしょ。浮いてるのはほっとこう、じきに慣れてくれる

コンパイラがCらしいね。でもjavaからも操作できる実績があるって
こういうときは、「やってみて脳汁が出そうなほう」でいいとおもう
結局モチベなんで
533はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f532-JeGG)
2024/11/07(木) 03:05:44.48ID:LEgJ6Wm00
Csound は公式に Python や Java 用のラッパーは用意してるみたいだから得意なのでやればよさそう。
ところで固有名詞は正確に表記してくれないと探しにくいやで。
534デフォルトの名無しさん (ワッチョイ 7e9a-NsVU)
2024/11/08(金) 17:26:41.87ID:k0cYSKPq0
g++とclang++が混ざった環境なのですが、g++でコンパイルしたバイナリはstd::stringとか
名前に__cx11というプレフィックスが付き、一方clang++の方は__1というものが付くようです

とりあえず、clang++の方で__cx11が付くようなバイナリを生成するにはどうしたら
いいでしょうか?
535デフォルトの名無しさん (ワッチョイ 7e9a-NsVU)
2024/11/08(金) 17:28:48.87ID:k0cYSKPq0
すみません、__cx11じゃなくて__cxx11でした
536はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f532-JeGG)
2024/11/08(金) 17:41:34.61ID:Me1tPYCI0
名前だけ合わせても具体的な実装方法が違えばどうせクラッシュするから意図的にマングルルールを違えている。
https://gcc.gnu.org/onlinedocs/gcc/Interoperation.html#Interoperation
537デフォルトの名無しさん (ワッチョイ 7e9a-NsVU)
2024/11/08(金) 17:52:36.03ID:k0cYSKPq0
>>536
なるほど、要は「C++コンパイラ、混ぜるな危険」ということでしょうか?
538デフォルトの名無しさん (ワッチョイ a901-7tmY)
2024/11/08(金) 18:12:15.75ID:6Qfff3nN0
例外とか互換性があるんかいな?
539デフォルトの名無しさん (ワッチョイ a901-7tmY)
2024/11/08(金) 18:14:37.25ID:6Qfff3nN0
C++コンパイラでコンパイルするにしても
ソースコードをCの範囲に留めて
関数プロトタイプを
extern "C"
すれば大丈夫だよ
540デフォルトの名無しさん (ワッチョイ 7e9a-NsVU)
2024/11/08(金) 18:18:53.42ID:k0cYSKPq0
>>539
なるほど、例えばこんな感じなら大丈夫なんですかね?
g++でコンパイルされたバイナリのグループAとclang++でコンパイルされたバイナリの
グループBがあったとき、AからB(またはその逆)を呼ぶときは必ずCリンケージの関数
経由にする、とか....
541はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 71e8-JeGG)
2024/11/08(金) 18:25:46.25ID:Evz7xgHe0
>>540
OK。
C インターフェイスの範囲ではどちらも同じ ABI (Application Binary Interface) に従ってるはず。
542デフォルトの名無しさん (ワッチョイ 7e9a-NsVU)
2024/11/08(金) 18:35:59.90ID:k0cYSKPq0
>>541
なるほど
皆さんどうもありがとうございます
543デフォルトの名無しさん (ワッチョイ b163-+nMC)
2024/11/09(土) 19:08:22.86ID:djyKk80a0
昔std::vector<T>とかstd::stringを前のコンパイラでビルドしたDLLに渡したら以下略
やっぱコンパイラを混ぜるときはextern "C" な関数にプリミティブな型のみを渡すインターフェース設計にするパティーンが安牌
文字列とか渡したかったらあくまでchar[]にすべき……
544デフォルトの名無しさん (ブーイモ MM43-QLv+)
2024/11/10(日) 16:10:22.46ID:ck6aMoNGM
>>536
この場合は別々に標準ライブラリがリンクされる、つまり2つ動くのかな?
545デフォルトの名無しさん (ワッチョイ 1b79-b0Xs)
2024/11/10(日) 17:48:03.99ID:cLh8//6O0
単にリンクするだけではどっちかのライブラリのスタートアップしか呼ばれないから
呼ばれてない方のライブラリの初期化がされなくてまともに動作しない問題が残ると思う
546はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 95cf-bar5)
2024/11/10(日) 18:18:05.60ID:R/A45v0+0
仮にどうにか辻褄合わせが出来てちゃんと動いたとしても将来の開発環境・実行環境でどうなるか予想しづらいというのもある。
547デフォルトの名無しさん (ワッチョイ 9bad-6tcr)
2024/11/10(日) 18:55:50.75ID:g8WH2rn90
こういう感じの実装を見かけたんだけど、ptrって解放済みの領域を指してないよね?

int *ptr = NULL;
std::map<char, int> m;
m.insert(std::make_pair('a', 30));
{
  std::map<char, int>::iterator itr = m.find('a');
  if (itr != m.end()) ptr = &(itr->second);
  // ここでitrは解放される
}

if (ptr) printf("*ptr = %d\n", *ptr); // 大丈夫?
548はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cd32-bar5)
2024/11/10(日) 19:59:53.20ID:a6nPaG4v0
>>547
itr が指してる先は m の一部なのでまだ生きてる。
問題ない。
549デフォルトの名無しさん (ワッチョイ 9bad-6tcr)
2024/11/10(日) 20:31:11.60ID:g8WH2rn90
>>548
あざっす!なるほど、よかった〜
550デフォルトの名無しさん (ワッチョイ 1563-EHNx)
2024/11/11(月) 00:36:44.76ID:6qsu0cnY0
>>545
ヤヴァイやん>>539しても全然OKじゃないやん……
551デフォルトの名無しさん (ワッチョイ 1563-EHNx)
2024/11/11(月) 00:38:49.39ID:6qsu0cnY0
ただしウィンドーズのDLLの呼び出し場合は>>539に従っていれば問題無いはず……
ランタイムの初期化エントリはDLL毎に_DllMainCRTStartup が用意されてDLL初期化時に呼ばれる
552デフォルトの名無しさん (ワッチョイ 759b-NX7e)
2024/11/11(月) 16:46:00.51ID:XlNa4SSE0
https://www.openwork.jp/company.php?m_id=a0910000000FrzY
553青木康善 (アウアウウー Saa9-gsEs)
2024/11/12(火) 22:22:32.82ID:svwbS+Oga
独習C++を図書館で借りました。よく、こんな、難しく、エグい言語が出来ますねみなさん。
554デフォルトの名無しさん (ワッチョイ 1d1f-hYHe)
2024/11/12(火) 22:26:44.98ID:r67kfyB40
他に選択肢がなかったんや😭

あと最近はobjective-cとかいう悪魔合体に比べたらなんでもマシな言語に思えてきてる
555デフォルトの名無しさん (ワッチョイ 0b9a-V0hi)
2024/11/13(水) 01:53:29.63ID:CoujH3FQ0
Objective-C++もよろしく
556はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cd32-4Bi2)
2024/11/13(水) 02:14:12.02ID:Gj2zjD3b0
>>553
汚いが、必要なものはある。
綺麗に整理されてても必要なものがないよりは良い。
557デフォルトの名無しさん (ワッチョイ 75c3-oheB)
2024/11/13(水) 03:47:19.43ID:rKuXlBFV0
そーだそーだ
C++は難しいからObject Pascalやろうぜ!
558デフォルトの名無しさん (ワッチョイ 25db-QT1F)
2024/11/14(木) 07:49:57.71ID:z8CYzrjO0
C++女学院の人々ってまだ読める所ある?
大好きだったんだけど。
559デフォルトの名無しさん (ワッチョイ a501-3n/g)
2024/11/14(木) 12:23:07.88ID:DkukOutW0
>>554
C++と悪魔合体してObjective-C++とかなってるけど自分は実用的に感じた
全部それで書こうとは思わんけど、C++との共存のレベルが高くて鼻血出そうになったわ
OSやその他Apple系APIとのやり取りはObjC++、それ以外のソースはC++のみ、とかも簡単だし
560デフォルトの名無しさん (アウアウエー Sa13-vkNS)
2024/11/14(木) 14:52:24.21ID:a5xmyjQfa
>>553
若い人がCからC++の増築増築で可笑しくなって行った歴史をなぞるのは無意味ではない

>>554-555
Objective-C や Objective-C++ の方がまし


やる気は無いけどObjectPASCALはDelphiだっけ
561デフォルトの名無しさん (JP 0H1e-hB9O)
2024/11/19(火) 11:41:41.34ID:1x1cv+pZH
演算子のオーバーロードない言語はダメだ
562デフォルトの名無しさん (ブーイモ MM02-7yGp)
2024/11/19(火) 11:53:31.53ID:5+FMYvHmM
演算子オーバーロードがもたらす言語仕様の複雑性を理解してたら軽々しくそういうことは言えない
563デフォルトの名無しさん (ワッチョイ 5f01-P+OA)
2024/11/19(火) 12:47:14.19ID:3l+Mgxo20
演算子なんてなしでも書けるわけで単なる見た目だよ
些末な話
564デフォルトの名無しさん (ブーイモ MM02-7yGp)
2024/11/19(火) 13:12:37.41ID:5+FMYvHmM
見た目はとても重要だが
見ただけでは何が実行されるかわからない
565デフォルトの名無しさん (ワッチョイ 67ab-Nkdq)
2024/11/19(火) 15:35:04.94ID:k4Dguh0Y0
JavaのBigDecimalなんか見てると演算子オーバーロードのあるC++羨ましいよ
c = a.multiply(b); とか長くなり過ぎて何をやってる式なのか分からなくなる
566デフォルトの名無しさん (ワッチョイ 67ab-Nkdq)
2024/11/19(火) 15:37:29.08ID:k4Dguh0Y0
いや固定小数型を言語仕様に盛り込まずにライブラリとして実装したJavaが悪いのか・・・
固定小数の取り扱い以外で演算子オーバーロードが欲しいと思ったことはない
567デフォルトの名無しさん (JP 0H1e-hB9O)
2024/11/19(火) 15:45:09.52ID:1x1cv+pZH
複素数計算やったことないからそんなこと言える
568デフォルトの名無しさん (ブーイモ MM02-iirp)
2024/11/19(火) 17:03:01.93ID:cTSQFdSPM
JAVAはコボラーが転んで使う言語だし
569デフォルトの名無しさん (JP 0H1e-hB9O)
2024/11/19(火) 17:38:58.74ID:1x1cv+pZH
自動微分のボトムアップ微分はC++の演算子オーバーロード機能のおかげで簡単に実現できる
570デフォルトの名無しさん (ワッチョイ 4218-KrXD)
2024/11/19(火) 18:42:30.52ID:ZMREqX8y0
javaって演算子オーバーロードないのか・・・
571デフォルトの名無しさん (アウアウエー Sa3a-iI0F)
2024/11/20(水) 17:06:14.09ID:vf/fflloa
>>567
†とか造った?
572デフォルトの名無しさん (ワッチョイ fb7c-rtho)
2024/11/20(水) 21:14:42.80ID:GASOinjS0
Javaが持て囃されてた頃は「演算子オーバーロード?+で引き算もできるってこと?なんて危険な機能なんだ!」って叩かれてて
そんな危険なものはJavaにはありません!って売り文句にされてたんだよ
アホみたいだけど本当の話
573デフォルトの名無しさん (ワッチョイ 4e8d-7yGp)
2024/11/20(水) 21:21:46.59ID:JO5RbARc0
アホといい切れる根拠は言える?
574デフォルトの名無しさん (ワッチョイ 4243-gDrC)
2024/11/20(水) 22:54:39.86ID:g9sD9hG/0
アホみたいなカスの嘘です
575デフォルトの名無しさん (ワッチョイ 0e79-Yo0P)
2024/11/20(水) 23:28:22.48ID:KXgtJp1v0
演算子オーバーロードは定義のリスクや手間の割には結局自己満に完結する事が多くて、
しかも結局C++という小さな世界でしか通用しないから、他に楽しい事が沢山ある今の人は時間の無駄と考えるんじゃないかな
576デフォルトの名無しさん (ワッチョイ ff07-pOJn)
2024/11/20(水) 23:48:15.85ID:F7TNJyq/0
無理に使うもんではないな たまにすごく便利
577デフォルトの名無しさん (ワッチョイ 7b71-nj0J)
2024/11/21(木) 00:20:44.87ID:PQXYbgG+0
std::chronoの時間型なんかは良い例だよね

・clock - clock = duration (例. 13時 - 12時 = 1時間)
・clock + duration = clock (12時+1時間=13時)
・duration + duration = duration (1時間 + 1時間 = 2時間)
・clock + clock: 不可

こういう型表現もできるのは良い点
578デフォルトの名無しさん (ワッチョイ 4e8d-7yGp)
2024/11/21(木) 01:22:06.15ID:KgLYxoZg0
初見で単に整数で取り出すのに一苦労だけどな
型安全厨くささ感じる
579デフォルトの名無しさん (ワッチョイ 06cf-xZnB)
2024/11/21(木) 08:22:14.09ID:5MMZVDCg0
演算の組み合わせが多いユースケースで可読性を上げるためのものだろう。
少ないなら関数のままでも十分。そういう意味で std::chrono は微妙。
580デフォルトの名無しさん (JP 0H1e-hB9O)
2024/11/21(木) 10:15:07.08ID:F4Mnbej3H
>>575

あんた他人の受け売りだろ。fortran90にだって演算子オーバーロードあるのに
581デフォルトの名無しさん (JP 0H1e-hB9O)
2024/11/21(木) 10:20:45.90ID:F4Mnbej3H
>>571
随伴行列(共役転置行列)か? それは演算子オーバーロードじゃなくて普通の関数でいいだろ
582デフォルトの名無しさん (ワッチョイ 8ee1-jy16)
2024/11/21(木) 19:11:25.04ID:U8jioV5J0
いわゆる演算子オーバーロードのメリットは、中置記法が使えるということと、一部の人間が使い慣れている演算子の算数・数学的記法のメタファーが使えることくらいかね。

その代償として文章構造の曖昧さや(その対処のための)優先順位といった規則の複雑化が必要になるので、言語設計観点からはメリット小さいよなぁ。
可能ならば中置記法を捨てて全部後置記法に統一したいところ。
583デフォルトの名無しさん (ワッチョイ 5f01-P+OA)
2024/11/21(木) 20:19:29.77ID:i1qXvmQ+0
嫌だよ! PostScriptじゃあるまいしw
584デフォルトの名無しさん (ワッチョイ ef63-ihPV)
2024/11/21(木) 22:03:09.07ID:vge40qUE0
チョムスキーの言語生得説って数学記号(の文法)も説明し切ってたっけ;;;
個人的には数学記号をプログラミング言語の文法に含めるのは悪手に思える
全部言葉にすべき
585デフォルトの名無しさん (ワッチョイ fb7c-rtho)
2024/11/21(木) 22:32:36.81ID:UrWSESvu0
そうだな
(8.0 * std::numbers::pi * G) / (c * c * c * c * mu0)よりも
divide(multiply(multiply(8.0, std::number::pi), G), multiply(c, multiply(c, multiply(c, multiply(c, mu0)))))の方がずっと分かりやすいもんな
586デフォルトの名無しさん (ワッチョイ 0e79-Yo0P)
2024/11/21(木) 23:37:39.60ID:w61o9EHy0
>>585
君どんくさいな
その括弧やカンマも排除するんだよ
587デフォルトの名無しさん (ワッチョイ 5f01-P+OA)
2024/11/21(木) 23:41:45.40ID:i1qXvmQ+0
8.0 pi mul G mul c c mul c mul c mul mu0 mul div
588デフォルトの名無しさん (ワッチョイ fb9c-jy16)
2024/11/22(金) 12:04:14.61ID:OZOUVDIp0
>>585
後置記法なら
(8.0 std::numbers::pi G)を掛ける
(c c c c mu0)を掛ける
割る
みたいな感じかな。
589デフォルトの名無しさん (ブーイモ MM02-fwvC)
2024/11/22(金) 16:24:36.41ID:prOH0XeSM
>>588
>>587
590デフォルトの名無しさん (ワッチョイ 36e6-slOl)
2024/11/22(金) 17:47:03.18ID:ckHOQP240
ポーランドにでも移住しろ
591デフォルトの名無しさん (ワッチョイ 0e79-Yo0P)
2024/11/22(金) 20:09:04.65ID:YUhadtJk0
政治的発言でチョムスキーは晩節を汚したな
592デフォルトの名無しさん (ワッチョイ ef63-ihPV)
2024/11/22(金) 23:05:27.32ID:qWC0+5lZ0
絶対数に平方の係数の四倍を掛け、中間項の係数の平方を加え、同平方根をとって中間項の係数を引いてから、平方[の係数]の二倍で割ったものを出力せよ
593aser-fgki (JP 0H1e-hB9O)
2024/11/22(金) 23:22:42.09ID:TibAXEMeH
>>585は痛烈な皮肉を言った。>>590は昔、HPの電卓が採用していた逆ポーランド法を連想して「ポーランドに行け」と言った。深いわ、ここのスレ
594デフォルトの名無しさん (JP 0H1e-hB9O)
2024/11/22(金) 23:31:47.69ID:TibAXEMeH
怖ヒから、退散します。
595デフォルトの名無しさん (ワッチョイ 0e79-Yo0P)
2024/11/22(金) 23:46:57.45ID:YUhadtJk0
どんな記法でもメソッドチェーンできれば勝つる
596デフォルトの名無しさん (ワッチョイ ff9a-V0/I)
2024/11/24(日) 06:44:31.77ID:CW4G8jt70
昔Turbo C++とか使ってたなあ
597デフォルトの名無しさん (ワッチョイ f79c-0AJs)
2024/11/25(月) 11:18:23.17ID:mvnjDr0E0
>>593
それも算数を習っていて、記号の意味や結合の優先順位、()グループ化のトレーニングを受けている前提だろ。

中置記法ではなく前置記法のトレーニングを受けている想定なら
/(*(8.0, std::number::pi, G), *(c,c,c,c,mu0))
だし、日本語ベースの後置記法なら中置記法のような特別なトレーニング無しで>588ぐらいは使えるかと。
598青木康善 (アウアウウー Sa5b-8bf6)
2024/11/27(水) 11:39:09.65ID:cLo+/Enba
やっぱり、C++は、難しいんで、慣れてるjavaで音楽ソフトウェア作ります。皆さんの健闘を祈ります。best regard
599デフォルトの名無しさん (JP 0H4f-6m00)
2024/11/28(木) 01:12:28.19ID:aCNd/9ZkH
ちん逃げやがったな。俺も人のこと言えんけど。
600デフォルトの名無しさん (ワッチョイ bfcc-6m00)
2024/11/29(金) 12:44:20.48ID:IhkudQsu0
Javaの構文的美しさは素晴らしかったけど
他言語に引っ張られて汚れてしまった
それならC++のほうが良い
何でもできるから
601デフォルトの名無しさん (ワッチョイ bfcc-6m00)
2024/11/29(金) 13:41:39.20ID:IhkudQsu0
やりたいことが出来る言語と
やりたいことが出来ない言語
602デフォルトの名無しさん (ワッチョイ bf6c-6oxW)
2024/11/29(金) 16:19:14.67ID:xzsI3pih0
なんでもできるは他を知らないだけだろ
603デフォルトの名無しさん (ワッチョイ 5707-hCSs)
2024/11/29(金) 17:33:38.53ID:BYCpquOz0
一応、自分の技量と気力で、希望するわがままが通るかは、調べてみるけどね
604デフォルトの名無しさん (JP 0Hdf-/Vqe)
2024/11/29(金) 18:57:30.48ID:ZW4PTdY8H?2BP(1000)

EchoAPIは私のVS Codeのセットアップに素晴らしい追加となり、APIテストがとても簡単になった
605デフォルトの名無しさん (ワッチョイ 7f7e-zwOW)
2024/11/29(金) 22:11:11.77ID:C48YuSW20
やりたいこと以外何でもできる言語
606デフォルトの名無しさん (ワッチョイ 5707-hCSs)
2024/11/29(金) 23:01:12.73ID:BYCpquOz0
やりたいことはできない。(サボりの)どうでもいいことはできる。ってほっとけww
607デフォルトの名無しさん (アウアウエー Sadf-wjfe)
2024/11/30(土) 09:53:14.46ID:l0dFcapba
x C++が難しい
o 頭が悪い
608デフォルトの名無しさん (ワッチョイ bfd9-6oxW)
2024/11/30(土) 12:21:10.79ID:tlb45efI0
c++が簡単ってまあ勘違いだろ
脱初級で全部わかった気になるやつ
個人的に尊敬してる人でも難しいと言ってる
609青木康善 (アウアウウー Sa5b-8bf6)
2024/11/30(土) 13:56:11.47ID:exhSsXMya
javaで、簡単なドラムマシン作りました。C++では、到底オツムが良く無い僕には無理です。皆さんの健闘を祈ります。
610デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/01(日) 18:28:00.78ID:IuCKzQHfH
xxx.h で namespace A { size_t intval, count, itr; } を宣言。もちろん、インクルードガードしてる。

ところが、作ったライブラリをテンプレート対応に修正したら、「intval, count, itr」が2重定義されてます。」
という旨のLINK1169のエラー(Visual Stuio 2022)が突然出てきた。前のライブラリではこんなエラー出てなかった
のに...ナンデダロー、ナンデダロー♪と悩んでいたが、

namespace A { extern size_t intval, count, itr; }

を宣言したら解決した。extern_や外部リンケージのことがが良くわからない。調べたら通りいっぺんのことは
わかるけど。LINK1169のエラーが出たら、extern宣言してみてLINK1169を殺す、という対症療法だけ学習しました。
611デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/01(日) 18:28:57.10ID:IuCKzQHfH
くそ!また改行がめちゃくちゃ
612デフォルトの名無しさん (ワッチョイ 0e62-jXfH)
2024/12/01(日) 18:31:33.21ID:NWNsoufr0
MAPファイルの読み方を研究した方が良いかもな
613デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/01(日) 18:32:40.91ID:IuCKzQHfH
それに誤字だらけだし。オワタ。高齢者の認知症検査試験大丈夫かな。5年後だけど。
614はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bd32-mEgI)
2024/12/01(日) 19:20:01.62ID:rI1+OlKH0
>>610
定義はプログラム全体でひとつとする原則 (one definition rule) は診断不要な場合がある仕様になっていて処理系が問題を検出できなくてもかまわないことを意味する。
つまりエラーが出てなくても間違っている (未定義の挙動) かもしれないので理解せずにエラーメッセージに頼るのは悪い姿勢。
615デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/01(日) 19:34:57.34ID:IuCKzQHfH
テンプレートにすると(implテクニックを使わなければ)、定義も実装も同じファイルに書かなければならないからそれが原因かなあ。とりあえず、厄介なLINKエラーは除霊されました。
616はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bd32-mEgI)
2024/12/01(日) 20:25:56.70ID:rI1+OlKH0
>>615
テンプレート内でグローバル変数にアクセスする箇所があるってこと?
それなら今はインライン変数を使うのが便利で行儀の良い作法のひとつだと考えられている。
インライン変数は C++17 からの機能なのでそれより古い規格しか使えないような事情があるなら仕方ないんだけど……
617デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/01(日) 20:32:06.26ID:IuCKzQHfH
>>616

ありがとうございます。調べてみます。
ちなみに、>>615 定義も実装も → 宣言も定義も ええいくそっ! まーた間違えた
618デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/01(日) 21:38:54.98ID:IuCKzQHfH
>>616

まーた、言い忘れました。まさにその状況でした。
619デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/02(月) 22:09:00.59ID:/dQ47H+wH
[][]演算子のオーバーロードが欲しい。行列を1次元配列で実装する場合、C++は行主順(行列を行ベクトルの集まりとみなす)。Blas、lapackのライブラリをビルドしたfortran77は列主順(行列を列ベクトルの集まりとみなす)。()演算子のオーバーロードでは、行主順だろうが列主順だろうが、行列Aのi行j列の要素にはA(i,j)とアクセスできるが、列主順の場合には[]演算子のオーバーロードをどうやってもA[j][i]となってしまう。それでeigenは()演算子のみをサポートしている(本当か?)。だが、A(i,j)が添字0から始まるのが気に入らん。添字が0から始まるのはA[i][j]やろうもん。
[][]のオーバーロードがあったらなあ。
620デフォルトの名無しさん (ワッチョイ 00f0-X9QH)
2024/12/02(月) 22:22:03.04ID:7rlMEi700
propertyなら簡単に多次元配列扱えそうなのに
propertyいつになったら実装されるのやら
621デフォルトの名無しさん (ワッチョイ b701-5W+W)
2024/12/02(月) 22:30:10.13ID:6C6t/Sm50
>>619
O [][]演算子のオーバーロードが欲しい。
O 行列を1次元配列で実装する場合、C++は行主順(行列を行ベクトルの集まりとみなす)。
O Blas、lapackのライブラリをビルドしたfortran77は列主順(行列を列ベクトルの集まりとみなす)。
X ()演算子のオーバーロードでは、行主順だろうが列主順だろうが、行列Aのi行j列の要素にはA(i,j)とアクセスできるが、
X 列主順の場合には[]演算子のオーバーロードをどうやってもA[j][i]となってしまう。
O それでeigenは()演算子のみをサポートしている(本当か?)。
X だが、A(i,j)が添字0から始まるのが気に入らん。
X 添字が0から始まるのはA[i][j]やろうもん。
O [][]のオーバーロードがあったらなあ。

行頭Xで示した文章の意味が良く分からん
622デフォルトの名無しさん (JP 0Hf2-Dj8N)
2024/12/02(月) 22:40:34.32ID:/dQ47H+wH
ああ、そう。
ところで、A(i,j)が添字0から始まるのが気にならないんだ。じゃあ、もうええわ。
623デフォルトの名無しさん (ワッチョイ 0e62-jXfH)
2024/12/02(月) 22:51:18.89ID:Fo02P0Bv0
msvc4.xxにoprater delete[]をoverideする機能が無い
所からCOMの仕様が策定されている所を考えると
面白いな
624デフォルトの名無しさん (ワッチョイ b701-5W+W)
2024/12/02(月) 22:58:33.93ID:6C6t/Sm50
>>622
日本語の意味が分からんと書いている
0オフセットが嫌ならiやjから1引けば良かろうもん?
625はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bd32-mEgI)
2024/12/02(月) 23:07:19.64ID:5A4jg9rQ0
>>619
[] がカンマで区切られた複数の引数を受けとる機能は入る見込み。
そのための前準備として [] の中でカンマ演算子を使うのが C++20 から非推奨になってる。 必要なら括弧で囲めばいいだけだから深刻な互換性問題にもならんだろうし。

[][] をオーバロードするとなると辻褄合わせが難しいだろうから入ることは期待できないと思う。
626はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bd32-mEgI)
2024/12/02(月) 23:09:49.14ID:5A4jg9rQ0
>>625
あ、アンカーを間違えた。 >>619 にすべきだね。
すまぬ。
627デフォルトの名無しさん (ワッチョイ c89a-+Y4l)
2024/12/04(水) 01:53:48.90ID:DpkrBRqF0
結局はベクトルや行列の演算の何かなんだろうから
二重配列を直接操作するというよりベクトルや行列のオブジェクトの演算を
定義する、演算子オーバーロードする、とかそういうコードを一旦書くわけには
いかないのかな?
628デフォルトの名無しさん (オイコラミネオ MMdd-Qs+Z)
2024/12/04(水) 11:10:28.05ID:1b6O8ksjM
[][]演算子が出来たら
[][][]の解釈に困るからできない

というより
[]が一つの演算子だから[][]はないし混乱のもと
[ , ]が正当
629デフォルトの名無しさん (アウアウエー Sa6a-VZt9)
2024/12/05(木) 20:29:34.16ID:bsPx8jUja
pythonみたいにhoge[:,:,::-1]みたいな描き方したい
operatorオーバーロードの仕方教えてくれ
630デフォルトの名無しさん (ワッチョイ 847c-0Hkv)
2024/12/06(金) 19:13:10.74ID:Ed4tJtIh0
どうしてもやりたいならユーザー定義リテラル使ってhoge[":;:;::-1"_slice]とか書かせるかなあ
631デフォルトの名無しさん (ワッチョイ 5e63-64DC)
2024/12/07(土) 17:49:57.38ID:hZoDLS6H0
[,]とカンマ演算子の優先順位はどうなるんじゃ……
まあすでに関数の引数部分で似たような状況((, , ,))だから良いのか……
632はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bd32-LsAq)
2024/12/07(土) 19:05:42.44ID:bmFGOE/o0
>>631
先述 (>>625) の通り [] 内での (丸括弧で囲まない形での) カンマの使用は C++20 から非推奨。
これは変更に対する布石で、 C++23 からカンマは引数の区切りのカンマとして解釈されることになった。
解釈が変わる (互換性が維持されない) 変更なのだが、大量の既存のコードを検証してそれが問題になるような使い方はほとんどない (あっても簡単に迂回できる) と判断された。
633デフォルトの名無しさん (ワッチョイ a7ad-7Ydj)
2024/12/08(日) 19:55:22.57ID:R/m6cDay0
mdspan でいいんじゃないかと
634350 (ワッチョイ 9744-3FWJ)
2024/12/30(月) 01:24:05.36ID:QjoRUJvQ0
>>316
char name[] = "sazaesan";

これ配列リテラルちゃうの?
nameはポインタだが
dc エリアに sazaesan\0 格納されるだろ
635デフォルトの名無しさん (ワッチョイ b6e7-F611)
2024/12/30(月) 02:23:21.03ID:OlG90g3v0
その話はもうええわ
636はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9732-1Vfr)
2024/12/30(月) 03:22:33.37ID:vy8OYYFk0
>>634
> これ配列リテラルちゃうの?

文字列リテラルは配列の一種ではあるが、この場合は配列一般を表すリテラルはないという意味。
(C にはコンパウンドリテラルがあるし、一部の処理系では C++ でも使える拡張があるけど。)
初期化子に現れる波括弧が配列リテラルだと誤解しているらしいことについての指摘なので文字列リテラルも配列リテラルだというのは関係がない。

> nameはポインタだが

いいえ。 name は配列。

> dc エリアに sazaesan\0 格納されるだろ

これはリテラルかどうかの話とは関係がない。
637デフォルトの名無しさん (ワッチョイ 9744-3FWJ)
2024/12/30(月) 08:13:16.60ID:QjoRUJvQ0
>文字列リテラルは配列の一種ではあるが、この場合は配列一般を表すリテラルはないという意味。

おおっと苦しいねぇw
638デフォルトの名無しさん (ワッチョイ 9a79-yyCf)
2024/12/31(火) 23:26:05.62ID:xpoxeW+N0
>配列リテラル
そもそもこの言葉がおかしい
配列リテラルなんてものは存在しない
リテラルは数値や文字、文字列の変更不可な定数を指す用語で、配列等の変数とは間逆の存在
配列は文字列リテラルとかで初期化はできるがリテラルには分類されない
主にjavascript界隈で平気で配列リテラルなんて説明してるサイトがあるが全部間違い
639はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9732-1Vfr)
2025/01/01(水) 11:07:42.20ID:KjvDobUm0
>>638
英単語としての literal の意味にそぐわなくても、言語仕様でリテラルという用語を割り当てられたならリテラルというしかない。
JavaScript (ECMAScript) のことはよう知らんけど仕様を見たら [] で囲んで配列を表現する文法には ArrayLiteral と書いてあるぞ。

https://262.ecma-international.org/15.0/index.html#prod-ArrayLiteral
640デフォルトの名無しさん (ワッチョイ 8b01-rRgN)
2025/01/01(水) 11:14:58.75ID:MMGltyx80
まぁ言葉の競合なんて稀によくあるし
641青木康善 (アウアウウー Sac7-DS50)
2025/01/02(木) 03:10:49.97ID:2OQRwfH2a
独習C++今から読みます。
642はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9732-1Vfr)
2025/01/02(木) 12:45:54.07ID:dC27qXct0
そうか。
643デフォルトの名無しさん (ワッチョイ 9a79-yyCf)
2025/01/02(木) 17:05:43.34ID:ZvjFvgyg0
>>639
そこ見たけどリテラルについては13.2.3 Literalsで定義されてるし
ArrayLiteralで検索したら13.2.4 Array Initializerと書いてあるから、ArrayLiteralはただの誤植だろ
そんなのを根拠にして配列リテラルなんておかしな説明が広まってるのか
644はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9732-mOud)
2025/01/02(木) 20:16:05.92ID:dC27qXct0
どうだろ?
同じものでも切り口によって呼び名が違うことはあるじゃないの。
たとえば字句的には識別子と呼ばれてるものが構文の上では変数だったり型だったりするわけで。
本当になんの使い分けの意図もなく単なる間違いなんか?
いやまあ、私はよう知らんから本当に間違いなんかも知らんけど。
645デフォルトの名無しさん (ワッチョイ 9744-3FWJ)
2025/01/03(金) 05:19:23.99ID:TELQMEJN0
>>643
だから
値による Initialize と Literal がどーちがうというんだ
何をこだわってるの?
646はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9732-mOud)
2025/01/03(金) 08:22:15.04ID:N2a/+7s70
用語は概念と結び付いてる。
理屈の建て付けが用語に現れているのだから用語の間違いは理屈の理解の誤り。
こだわるべき。

訳の都合とか歴史的事情でわかりにくい変な用語になってるのもよくあることだけどな。
647はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9732-mOud)
2025/01/03(金) 15:37:54.39ID:N2a/+7s70
常に厳密であるべきとまでは言わないけど、必要なときに説明できる程度にはね。
648デフォルトの名無しさん (ワッチョイ 8b01-rRgN)
2025/01/03(金) 16:40:53.84ID:nAACv6m40
せやな
649デフォルトの名無しさん (ワッチョイ 23ef-s7Wh)
2025/01/04(土) 19:25:11.41ID:Dnxz33hn0
ECMAScript® 2024 Language Specification
A Grammar Summary
https://tc39.es/ecma262/2024/multipage/grammar-summary.html#sec-grammar-summary
より抜粋
| PrimaryExpression :
| Literal
| ArrayLiteral
| ObjectLiteral
| RegularExpressionLiteral

| Initializer :
| = AssignmentExpression

camel case の『ArrayLiteral』等は文法記法上のシンボルであり専用の(斜体)フォントが使用されている。
『ArrayLiteral』は『PrimaryExpression』の下に『Literal』や『RegularExpressionLiteral』等と並んで定義されているので『Literal』の下には無い。
これを踏まえて、何故『ArrayInitializer』というシンボル名にしなかったのかという疑問なら話が分かる。C や C++ の『Initializer』関連も参考になる。
650デフォルトの名無しさん (ワッチョイ b62b-F611)
2025/01/04(土) 19:40:45.61ID:tP/ja7AQ0
その話つまんないから
651デフォルトの名無しさん (ワッチョイ 9732-mOud)
2025/01/04(土) 19:51:17.23ID:1P+FhTZO0
関西人が河童を追い払う古代遺跡、カッパドキヤ
652デフォルトの名無しさん (ワッチョイ dbc7-PiQp)
2025/01/07(火) 15:04:17.79ID:njoKzNHl0
初心者が聞いたら間違いなく混乱するなこりゃ
普通リテラルってデータリソース「表現」のレベルでメタキャラと対な概念、って点をまず押さえるべきなんじゃないかと
Cならバックスラッシュがリテラルかメタキャラかはシングルクウォートで囲まれるかダブルクウォートで囲まれるかで変わる、みたいな感じで

あと表現と「実装」(配列orリストorタプルetc.)をごちゃ混ぜに議論してるのも良くない…気がする
JSでの用語用法に関しては正直どうでもいい他所でやれとしか
653デフォルトの名無しさん (ワッチョイ 9944-7f6o)
2025/01/09(木) 16:41:07.20ID:G2VPgYgX0
>>646
こだわってるのはお前だけ
しかも値によるInitializeとLiteralは用語の間違いではなく同じものでしかない
寝言ほざくな
654デフォルトの名無しさん (ワッチョイ 9944-7f6o)
2025/01/09(木) 16:43:12.80ID:G2VPgYgX0
このはちみつなんとかて
なんでこのスレにずっと張り付いてるの?
655デフォルトの名無しさん (ワッチョイ d315-bDSa)
2025/01/09(木) 17:53:02.65ID:pauriN870
コテハンだから目立つというだけで、名無しでずっと張り付いてるのもいるでしょ
656デフォルトの名無しさん (ワッチョイ 93ad-ZS2K)
2025/01/10(金) 15:09:57.30ID:5TDMwabH0
むしろこの手のスレで名無しのすべてが毎回入れ替わって別人なんだと思えるほうが異常とも言える
657デフォルトの名無しさん (ワッチョイ 4b73-gMcM)
2025/01/10(金) 19:09:29.05ID:Sq5TZMET0
名前が売りたいならtwitterとかで活動された方がいいんじゃないのと思っている
658デフォルトの名無しさん (ワッチョイ 93ad-ZS2K)
2025/01/10(金) 19:28:58.52ID:5TDMwabH0
は?w
はちみつ餃子なんて名前売って何になるってんだ?
ペンネームかなんかで活動しているわけでもないのに
659はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9932-vZ9d)
2025/01/10(金) 19:32:01.54ID:2xRvglud0
名前が広く知られる必要も意味もない。
話を追いやすくするのが主目的であって「私」というキャラクタを主張したいわけではないので、むしろ意図的に 5ch 上でだけはちみつ餃子と名乗ってる。
(元々はSCHEME餃子と名乗っていたが Scheme スレ以外にも書き込むので変えた。)
Twitter (X) のアカウントも持ってはいるけど。
660はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9932-vZ9d)
2025/01/10(金) 19:36:59.79ID:2xRvglud0
議論してても別の主張と混同されたり自演認定してくるやつがいたりして本筋からズレまくって面倒くせぇことが結構あるんだよ。
コテハンはコテハンでなんだかんだ言うやつがいるからどっちもどっちで面倒くせぇけどな。
661デフォルトの名無しさん (ワッチョイ b101-BLbR)
2025/01/11(土) 12:15:30.40ID:RVo7o+pP0
酉だけで十分では
662デフォルトの名無しさん (オッペケ Sr4d-8Wha)
2025/01/11(土) 20:48:36.46ID:bI8uLgjvr
「一応署名」するんなら、CNはあったらいいぞ
663デフォルトの名無しさん (ワッチョイ 9563-sRsu)
2025/01/18(土) 07:24:59.91ID:Kzk7GzSP0
動作から見るポインタと配列の違い……
char arr[] = "abc";
char* p = &(arr[0]);
assert(&p != &(arr[0]));
assert((void*)arr == (void*)&(arr[0]));
いや知らんけど多分……

メモリ割り付けまで見たらもっとはっきり違いがわかるパースン
664デフォルトの名無しさん (ワッチョイ 9563-sRsu)
2025/01/18(土) 07:27:41.04ID:Kzk7GzSP0
訂正orz……
誤: assert((void*)arr == (void*)&(arr[0]));
正: assert((void*)&arr == (void*)&(arr[0]));
665デフォルトの名無しさん (ワッチョイ cfaf-BCxs)
2025/01/24(金) 23:21:44.53ID:U5y9xmGO0
コンパイル時にsoファイルをリンクする時って参照されるsoファイルを参照している側よりも後ろに書くみたいなルールあると思うんだけど、
このルールに従わずsoファイルを前に書いた時にコンパイル成功する環境と失敗する環境がある

失敗するときのエラーはundefined reference errorでso側を参照しているところでエラーになってる

gccのバージョンは一応同じで、OSはwslのUbuntuとRedHat
Redhat側で成功している
コンパイルするときのコマンドは同じもの

原因ってどのへんにあるのかわかります? あるいは何らかの設定で回避できるとか

似た事象でこの辺が引っかかったけど答えはなかった
https://forums.debian.net/viewtopic.php?t=152808
666 警備員[Lv.18] (ワッチョイ 33b8-iSs0)
2025/01/25(土) 00:01:43.45ID:xAYAQReB0
環境変数の違いじゃないのLD_PRELOADとか
667デフォルトの名無しさん (ワッチョイ 0301-o26Q)
2025/01/25(土) 15:04:34.61ID:Q3LYFAxD0
LD_PRELOADが影響与えるのは実行時なのでは?
668デフォルトの名無しさん (ワッチョイ 7f70-FMGu)
2025/01/25(土) 15:11:01.85ID:LC7IJQQw0
せやな

書ける範囲で具体的なオプションを書いてくれると助かる
もしかしてディストリでsoの置き場所が違うのにそれに対応してないとか?
669デフォルトの名無しさん (ワッチョイ 6f9b-Bxv4)
2025/01/25(土) 17:20:55.15ID:W3I6NstP0
使ったことないけどマニュアル見る限り-tでリンクするファイル表示できるっぽいな
670青木康善 (アウアウウー Saa7-XwLX)
2025/01/25(土) 18:16:04.92ID:s6qQIUHWa
今日から、reasonというDTMソフトの、rack extentionを作るために学ぶことに決めました。
671青木康善 (アウアウウー Sa47-7ROj)
2025/01/26(日) 10:12:34.34ID:bIavjdz2a
core javaみたいな、書籍がC++にも無いかなあ。
672デフォルトの名無しさん (ワッチョイ 0eaf-cjCd)
2025/01/26(日) 16:16:40.95ID:ZRokd9b50
>>668
遅くなってすまぬ
だいたいこんな感じ

失敗するコマンド
g++ -L$LibPath -lTestLib -o Test main.cpp

成功するコマンド
g++ -L$LibPath -o Test main.cpp -lTestLib

TestLibのファイル名はlibTestLib.so

このあたりを読むに(https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
リンク時のライブラリ指定の順番的は後者が正しいと思うんだけど、なぜかRedHatの方だとエラーが出ない

RedHatの動的ライブラリ周りの記述を見ると"gcc ... -Llibrary_path -lfoo ..."みたいな書き方しかしていない
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/developing_c_and_cpp_applications_in_rhel_9/using-libraries-with-gcc_assembly_creating-c-or-cpp-applications#using-a-dynamic-library-with-gcc_using-libraries-with-gcc
673デフォルトの名無しさん (ワッチョイ 0b01-jk+K)
2025/01/26(日) 21:28:32.98ID:h08Ozzg50
Redhatで俺様パッチでも当たってるんかな?
674はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1bed-QOli)
2025/01/27(月) 10:03:20.61ID:CEXr069M0
GNU Linker では順番通りに一度しか探査しない仕様なので指定の順番に意味がある。
どういう順番でも通るなら GNU Linker 以外が設定されてるんじゃないのかな。
g++ はフロントエンドに過ぎないし、呼び出すリンカを変えるように設定は出来る(されてるかもしれない)よ。
675デフォルトの名無しさん (ワッチョイ 0e9d-cjCd)
2025/01/31(金) 00:55:21.04ID:07X4f1Va0
そういえばリンカーが何かって確認してなかった
後で確認してみる。ありがとう
676はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff32-DO7v)
2025/02/10(月) 11:15:20.00ID:cWC6BpGk0
主要なリンカとしては gold, lld, mold などがある。
これらに比べると GNU Linker は単純に遅い。
ただ、オブジェクトファイルの構造には文書化されていない場当たり的に決められた不明瞭な部分も多くてよくわからんところは「GNU Linker の挙動が仕様」みたいな扱いなので確実に「正しい動作」を期待する保守的なディストリビューションは GNU Linker を採用することも結構ある。
677デフォルトの名無しさん (ワッチョイ 8634-aAq2)
2025/02/10(月) 17:33:04.35ID:fQxZ+XGm0
グローバルな変数を使う時って、
namespace hoge{ constexpr int hoge; };

class hoge{ static int hoge; };
のどっちを使うべきですか?
678デフォルトの名無しさん (ワッチョイ 4663-6Hi7)
2025/02/10(月) 18:47:33.05ID:6W8L/x5D0
どうでもいい
好きにやれ
679デフォルトの名無しさん (ワッチョイ ebda-2Ob3)
2025/02/10(月) 19:05:23.46ID:FgXBIPm00
上のconstexprはいらない
何のためにつけたか不明だが
680デフォルトの名無しさん (ワッチョイ ff9c-mDEt)
2025/02/10(月) 19:22:59.53ID:LsLUwoXt0
昔はグローバル変数の代わりに関数のstatic local 変数を使ってたけど、最近はどうなのかしらん?
681はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff32-DO7v)
2025/02/10(月) 19:32:01.21ID:cWC6BpGk0
>>677
どちらの変数もグローバル名前空間スコープで宣言されていない。
682デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/16(日) 10:13:30.97ID:AY7cmtZI0
namespace foo { int hoge; } だとusing foo::hoge; ができるが
class Foo { public: static int hoge; } だと using Foo::hoge; できない
という印象、
683デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/16(日) 10:17:01.36ID:AY7cmtZI0
オブジェクトの寿命がプログラムの開始から終わりまでずっとあるがグローバル名前空間スコープで宣言されていないがために
グローバル変数と言ってはいけないならが
オブジェクトの寿命がプログラムの開始から終わりまでずっとあるがグローバル名前空間スコープで宣言されていないオブジェクトは
何て言えば良いんじゃ……
684はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ed32-7Htj)
2025/02/16(日) 10:19:16.22ID:3LJfyOAU0
>>683
静的記憶域期間の変数
685デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/16(日) 10:21:00.02ID:AY7cmtZI0
今やDouble-Checked Locking is Fixed In C++11されたのだから
static local 変数を使う意味は無くなた
※ 個人の感想です
686デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/16(日) 10:23:32.78ID:AY7cmtZI0
>>684
なるほど……
これからはレビューでグローバル変数と口走る香具師が居たらすかさず訂正を要求するわ㌧クス、
687はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ed32-7Htj)
2025/02/17(月) 10:05:32.77ID:tIRsmIw80
言語仕様 (C++23) 内でグローバル変数 (global variable) という語を使っている箇所を検索してみたら二箇所みつけた。
https://timsong-cpp.github.io/cppwp/n4950/diagnostics.general#2
https://timsong-cpp.github.io/cppwp/n4950/fs.op.current.path#5

前者は意味がわからん……英語と C++ に詳しい人は解説してくれんか。
後者はどこで変更されるかわからんものというニュアンスで、文法上の分類としての意味はなさそう。
688デフォルトの名無しさん (ワッチョイ e314-MHHu)
2025/02/17(月) 10:30:13.63ID:afCQWVrm0
errnoのことでしょ、昔は本当にグローバル変数だったらしいし、そのせいか今も「errnoはグローバル変数です」って説明がそこら中に転がってる
そこセクション概要だし、後者と同じで別に言語仕様上の意味はないと思う

お客様の中にC/C++/UNIX/POSIXそれぞれにおけるerrnoの仕様/記述の歴史家はおられませんか
689デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/18(火) 00:30:31.98ID:lk7OswCX0
>グローバル変数とは、複数の関数から使用できる変数のことを言います。
>グローバル変数は、関数外で宣言された変数です。
>一方、関数の外側でも変数を宣言できます。 これを グローバル変数 と言います。
ぢつは自動変数以外はTLSもファイルスコープのやつも静的記憶期間の変数も全
部グローバル変数だったりして……
690デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/18(火) 00:33:19.53ID:lk7OswCX0
当然オブジェクトのメンバ変数も関数の外でクラスが定義されている限り、
自動オブジェクトであってもメンバ変数は例外なくグローバル変数である
という定義にしたら単純で誤解の余地も無い
691デフォルトの名無しさん (ワッチョイ fd63-KThN)
2025/02/18(火) 00:44:49.13ID:lk7OswCX0
しかしよく考えたら
>グローバル変数とは、複数の関数から使用できる変数のことを言います。
には他の関数に参照渡しされた自動変数も含まれるから、アドレスが関数外に流出して
メモリエリアシングの可能性がある変数はみなグローバル変数ということなのかも……

lud20250219122316
このスレへの固定リンク: http://5chb.net/r/tech/1698705458/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「C++相談室 part165 ->画像>1枚 」を見た人も見ています:
C++相談室 part126
C++相談室 part138
C++相談室 part143
C++相談室 part135
C++相談室 part131 [無断転載禁止]
C++相談室 part142
C++相談室 part137
自営業 悩みごと相談室 40
【LGBT】自分が女性であることがいや。もし今世、性を男にした場合、来世はどうなるのでしょうか。【ハッピーサイエンスお悩み相談室】
C#, C♯, C#相談室 Part95
船乗りなんでも相談室・11 [無断転載禁止]
【スキー】初心、初級者 滑り方相談室13【目指せパラレル】
シーバスなんでも相談室86
【ハァテレビも無エ】ageteoff茸 埋め立て荒らし はんなり相談室★65 [無断転載禁止] [無断転載禁止]
【ノーワッチョイ】船乗りなんでも相談室 23【内航船】
初心者優先デジタル一眼質問・購入相談室 127
【スキー】初心、初級者 滑り方相談室14【目指せパラレル】
【スキー】初心・初級者 滑り方相談室5【目指せパラレル】
【粛々と?】忍法帖巻物質問スレ★34【相談室】
ミニミニ(minimini)相談室
【成就?】告白への恋愛相談室 27号車【失敗?】
嫁の浮気相談スレ PART37
【外交】安倍首相が英国訪問、28日にメイ首相と会談
【日中首脳会談】「パンダも元気に育ってる」 安倍首相、関係改善へ習氏に秋波 [無断転載禁止]
【自転車】-ロードバイク購入相談スレ【152台目】
【初心者】ダイエットの質問・相談スレPart190
【国際】南シナ海問題 仲裁裁判判決めぐり協議へ=安倍首相、フィリピン外相と会談
【消費者被害推計】SNSトラブル相談が最多 出会い系サイトなど [無断転載禁止]
島耕作さん、会長退任で「相談役 島耕作」に
クロスバイクの雑談&購入相談136
Excel総合相談所 136
【動物】犬や猫にも心の病 尻尾追いぐるぐる、攻撃、むやみに吠える、トイレじゃない場所での排泄…まずは動物病院に相談を
【ダイナース】冬茄子会員談話室【プレミアム】
Diners Club /// ダイナースクラブ 会員談話室 137
【芸能】ウーマン村本さん、小泉元首相との対談で噛みつく「若干、イラッとしました」
ドイツ戦車閑談室 その81
米国韓国北朝鮮、フィンランドで会談へ 非核化を協議
相笠萌が講談社アイドルコンテストでグランドファイナル目指して奮戦中
中国と戦うベトナム首相 インド首相と会談 防衛協力強化へ [無断転載禁止]
【ダイナース プレミアム】黒茄子会員談話室77
【修理】整備工場 プロに相談 その79【整備】
詐欺会社御三家が運営する詐欺被害相談.NET (違法 誹謗中傷サイト) [無断転載禁止]
Diners Club /// ダイナースクラブ 会員談話室 141
【心と宗教】-霊友会系 先祖供養談話室 4
【Linux系】PCオーディオ談話室【AU】Part10
【悲報】ジャーナリスト山口敬之さん、昏睡レイプの件を北村滋内閣情報官にメールで相談 → 間違って新潮編集部に送ってしまう ★2
【自転車】-ロードバイク購入相談スレ【127台目】
クロスバイクの雑談&購入相談171
【都知事選】小池百合子氏の出馬表明、萩生田光一副長官「相談なく意思表明に違和感」 [無断転載禁止]
【雑談】離れの和室 261部屋目【スレH】 ©bbspink.com
世界の王室雑談スレPart84
【雑談】離れの和室 282部屋目【スレH】 [無断転載禁止]©bbspink.com
世界の王室雑談スレPart40 [無断転載禁止]
【雑談】京の茶室 163部屋目【スレH】 [無断転載禁止]©bbspink.com
世界の王室雑談スレ part140
【初心者】キリスト教@歓談室61【歓迎】
世界の王室雑談スレPart90
【雑談】ひっそり個室202号室【スレH】 ©bbspink.com
【初心者】キリスト教@歓談室85【歓迎】
【個室】ラブ☆ルーム 119号室 【雑談・スレH】©bbspink.com
◆悟りを求めない人の談話室◆2(仮)
【ニコ生】静葉ちゃんの雑談室part66
● 英会話教室 *質問雑談* 総合スレッド 2 ●
字書きさんの談話室 第57分室
ID設定議論相談雑談スレ Part3
初心者】キリスト教@歓談室50【歓迎
22:23:16 up 36 days, 23:26, 0 users, load average: 6.43, 16.22, 18.81

in 0.98067593574524 sec @0.038289070129395@0b7 on 021912