!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part164
https://mevius.5ch.net/test/read.cgi/tech/1683600652/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C++相談室 part165
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ efda-9b8G)
2023/10/31(火) 07:37:38.52ID:+ZyYyqMO0158デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 14:15:12.02ID:rNqWj2dY0 つなみにOSの内部ではすべてのリソースをOSが管理する前提なので例外の出る幕は無い
OSの設計に対して想定外の事象がOS内部で起きるとかあり得ないじゃない
レトロな(しかしメジャーな)OSがC++ではなくC言語で書かれ続けるのはそういう理由
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に丸めるどアホは多いけど
返り値はエラー体系を自分で定義しないといかんからそうはなりにくい
まぁそれでも失敗を安易に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というのもあるかもしれない
全選択肢を同時に選ぶって意味に捉えられちゃったかな?
そうじゃなくて、その選択肢自体が同時に適用すべきレベルのものじゃないと思うの
例外をキャッチするって決めたなら、そこには目的があるよね?
設計手順としては目的を決めてから例外を使おうって判断になるわけ
その目的次第だよね?っていうのが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
これが正しいかどうかはおいといて、人命に関わらないなら、自分はその考え方に賛成!
完璧にデバッグしろというのは自動車と医療機器など人命にかかわるものだね
重要度に応じて工数のかけ方が変わってくるので、すべてのソフトウエアで一概にこうしなさいとは言えないかな
そういう意味ではD
165デフォルトの名無しさん (ワッチョイ 4d34-7Ntv)
2024/01/14(日) 15:16:56.65ID:by9QQMRz0166デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 08:10:14.00ID:Y8oMeLNI0 人命にかかわらない場合であっても、末端の関数が投げる例外の種類を見落としただけでプログラム全体が
いきなり落ちるのは勘弁してほしいし、それを防ぐために全部の関数が投げる例外の種類を全部把握するというのも
無理ゲーに近い。
なので適当なレイヤーごとにざっくり std::exception をキャッチする造りにしてるな。例外の種類で選択したりはしない。
いきなり落ちるのは勘弁してほしいし、それを防ぐために全部の関数が投げる例外の種類を全部把握するというのも
無理ゲーに近い。
なので適当なレイヤーごとにざっくり 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ブロックの処理が失敗したものとして処理を続ける。
その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 して「印刷中に不明なエラーが発生しました」みたいなまとめかたはあるかなー
とりあえず 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>')
実行しているように見えます。--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
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個かそこらの関数それぞれについて行われねばならない。
検証もそんだけ組み合わせが増える。
横やが関数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() { }を極力しない
という処置になるわ
けや
・ライブラリ製作者はなんか都合が悪い事が起きたら何でも呼び出し元に返す。
第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せねばならない
一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある
>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せねばならない
誤:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない
正:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外が飛んでくる想定であるならばcatchせねばならない
185デフォルトの名無しさん (ワッチョイ 797c-+np5)
2024/01/28(日) 12:19:26.10ID:/bXkl1Cz0 >>183
それはfuncB()に失敗の可能性がある時に必ず必要な話だろ?例外どうこうじゃないじゃん
funcB()が例外を投げずに古き良きintのエラーコードを戻り値で返す場合は何かが変わるの?
まさか「funcBの戻り値をガン無視すればfuncCもfuncDも実行されてくれるから完璧!だから例外はクソ!」っていうゴミカスみたいな主張をしたいわけじゃないよね?
それはfuncB()に失敗の可能性がある時に必ず必要な話だろ?例外どうこうじゃないじゃん
funcB()が例外を投げずに古き良きintのエラーコードを戻り値で返す場合は何かが変わるの?
まさか「funcBの戻り値をガン無視すればfuncCもfuncDも実行されてくれるから完璧!だから例外はクソ!」っていうゴミカスみたいな主張をしたいわけじゃないよね?
186デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 12:28:00.13ID:Gsm093HM0187デフォルトの名無しさん (ワッチョイ 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) とかコピコン以外にもみたことのないコンストラクタが要求されるし
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++ への置き換えがすっきりと書けるはずがない。
スマートポインタを使わないバージョンも C++ 的にはすっきりしてない。
動的多態の必要が必要ないのに持つべきメンバ関数を強制するためだけに抽象クラスを使っていて不恰好に見える。
コンセプトの導入がだいぶん後回しになった C++ の問題でもあるんだが……。
設計理念が妥当かどうかはともかくとして、元が Java なら直訳めいた C++ への置き換えがすっきりと書けるはずがない。
191はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+)
2024/01/28(日) 21:08:52.58ID:hRRbWEE/0 ざっと見た感じだと抽象クラスとして必要なのは Entry だけかな。
ジェネリックラムダが visitor パターンで使いやすいのでそういうのが使いやすいように配慮するといいかも。
std::visit が C++ での visitor パターンのお手本だよ。
ジェネリックラムダが visitor パターンで使いやすいのでそういうのが使いやすいように配慮するといいかも。
std::visit が C++ での visitor パターンのお手本だよ。
192デフォルトの名無しさん (ワッチョイ b501-PlwZ)
2024/01/28(日) 22:46:18.85ID:VLKT1lFt0193デフォルトの名無しさん (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
だいぶすっきりしたんじゃない?
・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
標準ライブラリを積極的に活用することにしたらこうなった。
https://wandbox.org/permlink/BQCNjfdJRKWAR3dg
195◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/29(月) 04:35:04.36ID:M6sadnnj0196◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/29(月) 05:00:34.95ID:M6sadnnj0197はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-MxBP)
2024/01/29(月) 12:08:36.13ID:WXyC0nMC0 スマートポインタを使うにしても std::shared_ptr って必要?
この場合は std::unique_ptr でよくない?
https://wandbox.org/permlink/dMolraFpQHKzYtF3
設計思想によるけどファイルシステムを表現するという前提だと
ひとつのルートディレクトリに連なる全てのエントリは実質的に一体のデータ構造なので
ルートディレクトリエントリの寿命が尽きれば全て解体ってことにしたほうが簡単でいいと思う。
ハードリンクの表現とかも考えるなら事情が変わってくることもあるだろうけど……。
この場合は 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
このへん参照されたし
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の機能の一覧も見てみたけどそれらしいものはなかったし
なんか「子クラスのコンストラクタに親クラスのオブジェクトを渡して子クラスのメンバを初期化する」(?)みたいなことができちゃってるんだけど、これってどういう仕様でこうなってんの?
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);
とすることが許されるようになった。
designated initializer も C++20 からの機能なんだけど……それは脇に置く。
この場合は集成体初期化に該当する。
C++17 から基底の初期化も集成体初期化で扱えるので
child c{p};
というように初期化出来ていた。
更に C++20 では集成体初期化を丸括弧で書いても良いことになったので
child c(p);
とすることが許されるようになった。
>>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
それはともかく、皆様のご意見には感謝しております。これからもお伺いさせていただいた際にはよろしくお願いいたします。
>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が集成体じゃなくなってたからだったんだね
ありがとう、勉強になった
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 & を多用する毎日です
>値で持てるところは単に値で持つほうがC++っぽいと思う
時代の流れを感じさせるお言葉です。なにせ K&R1 で育った世代なので(K&R1 では構造体の実体渡しはできず、かならずポインタで渡さなければならなかった)。
C++ においても、コピコンを働かせないために const & を多用する毎日です
204はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-MxBP)
2024/02/03(土) 14:49:57.28ID:Sz70frqK0 >>203
内部的に値で持つのでもポインタで持つのでもいいけど
「簡単に値として取り出せる」のはあまりよろしくないと思う。
これ (>>189) がおそらくファイルシステムを表現しようとするもの
だという前提を考えたらオブジェクトの構造も
ファイルシステムのモデルを抽象するものであるべきだと思うから。
ファイルはそれがある場所にも意味があるからファイルを象徴するオブジェクトが
場所から離れてやりとりされるのは違和感がある。
まあファイルシステムのモデルをどう捉えるかは私の感想でしかないから
何が妥当とは強くは主張しないけど、
いずれにしても実装上の都合じゃなくて使う側の感覚でどうなってて欲しいかという視点が要ると思う。
内部的に値で持つのでもポインタで持つのでもいいけど
「簡単に値として取り出せる」のはあまりよろしくないと思う。
これ (>>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) という比較・条件分岐を行うのは意味のある比較になっているのでしょうか?
別のクラス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++のクソっぷりが如実に表れている関数
でもなるべくそういう判定は無しでいけるように設計したいところだよな
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のメンバ関数の中では呼び出しを一文書くだけでいい。
分岐条件を網羅しそこなうしょうもないミスはよくあることだから
手作業での網羅を避けられるならそのほうがいい。
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 と同じと言えば同じであるはずで、
コンパイラ内部で効率よく区別するのは難しいはずです。
どうしてるんでしょう。
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 を採用しているもの
なかなか不可思議であります。
符号付き整数の最大値は、
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には添字は「スコープ無し列挙型か整数型」て書いてあったよ(該当箇所だけつまみ読みしたから正しく読めてる保証はできないけど)
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 「でもよい」という意味だと思うよ。
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の中身はうまいこと解放されたりするんでしょうか
場合によってはラムダ式を使ってオブジェクトをキャプチャしていたりして
あまりその辺りの説明が見当たらない感じがしました
一旦有効化した後にこれを無効化したい場合って、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:kuiQPbhX0220デフォルトの名無しさん (ワッチョイ 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 どちらもエラー
になる可能性は高いですが、理由は結構異なる
と言えば異なると思います。
>長いからよく読んでないけどコンパイラは型
>を認識をしてんだから-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 という大きな値
に過ぎません。
どちらもエラーになる可能性が高いですが。
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
ルール決まってるから
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整数はないと思ってるの??
32bit環境には64bit整数はないと思ってるの??
226デフォルトの名無しさん (オイコラミネオ MMeb-tjaG)
2024/02/08(木) 18:55:38.81ID:DVUqgRU9M >>223
なるほど。そうなるわけですね。
本当に書いた人の意図がどうかに関わらず、
規則で決まっていると。
1UL のように書いてあれば unsigned。
そして、UL のようなものを書いてない場合、
1 のように小さな値は、signed ですが、signed の
範囲を越えるようなものは、unsigned になる、
などの規則があるわけですね。
なるほど。そうなるわけですね。
本当に書いた人の意図がどうかに関わらず、
規則で決まっていると。
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:KJGevrBa0229デフォルトの名無しさん (ワッチョイ 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個のオーダーで要るだけ……
>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()がエラーを例外で返そうと戻り値で返そうとなんか他の方法で返そうと何も変わらないはずじゃないか
読み飛ばしてねえよ
funcB()は処理を中断すべきエラーが発生する可能性があるんだろ?だったらそれを適切に処理して後続の処理をやったりやらなかったりする必要があるわけだろ?
それはfuncB()がエラーを例外で返そうと戻り値で返そうとなんか他の方法で返そうと何も変わらないはずじゃないか
231デフォルトの名無しさん (ワッチョイ ffcf-HxQs)
2024/02/10(土) 18:55:23.41ID:0f3gz8pL0 >>229
>例外が飛んでこないことを確認するのテストケースがm個のオーダーで要るだけ……
いったい何をテストしようとしているんだろうか。
仮に「例外が飛んでこないことを確認するテスト」なるものができたとして、catchしたらそれができなくなるのか?
前半のよくわからない計算はcatch句を書いたらそのC0網羅のためのテストケースが必要になるとかいうことなんだろうか。
>例外が飛んでこないことを確認するのテストケースがm個のオーダーで要るだけ……
いったい何をテストしようとしているんだろうか。
仮に「例外が飛んでこないことを確認するテスト」なるものができたとして、catchしたらそれができなくなるのか?
前半のよくわからない計算はcatch句を書いたらそのC0網羅のためのテストケースが必要になるとかいうことなんだろうか。
232デフォルトの名無しさん (ワッチョイ ffcf-HxQs)
2024/02/10(土) 20:56:08.28ID:0f3gz8pL0233デフォルトの名無しさん (ブーイモ MM8f-tai3)
2024/02/10(土) 21:22:31.20ID:dL54PN9cM234デフォルトの名無しさん (ワッチョイ ffcf-HxQs)
2024/02/10(土) 22:40:34.32ID:0f3gz8pL0 >>233
逆だろ。catchしないのはライブらにが未知の例外を投げてこないだろうと信用してるってことだろ。
逆だろ。catchしないのはライブらにが未知の例外を投げてこないだろうと信用してるってことだろ。
235デフォルトの名無しさん (ワッチョイ bf27-tai3)
2024/02/10(土) 23:44:13.35ID:iRyhZExm0236デフォルトの名無しさん (ワッチョイ ef63-uLm/)
2024/02/11(日) 03:08:09.08ID:4PD3HqyC0237デフォルトの名無しさん (ワッチョイ 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
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: 非正規数
誤1: IEEE735
正1: IEEE754
誤2: 非正規化数
正2: 非正規数
239デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/11(日) 06:22:40.58ID:2tL2xZqD0 >>237
wandboxに書いてみ
wandboxに書いてみ
240はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f740-Kvqi)
2024/02/11(日) 07:55:26.62ID:nHqSm2on0241デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 09:19:29.20ID:XOPhWcHA0242デフォルトの名無しさん (ワッチョイ 637c-IqbK)
2024/02/11(日) 09:29:04.38ID:9XvrSVak0 例外は「関数外にエラー発生を伝える」ための「方法の一つ」でしかない
関数の処理がどんなエラーを発生させうるか、受け取った外側の処理がその情報をどう取り扱うべきかという問題とは完全に直交してる
(言語ごとにある程度の慣例はあるけどあくまで慣例)
例外に変なこだわりや的外れな批判をしてる奴は大体そこを勘違いしてる
関数の処理がどんなエラーを発生させうるか、受け取った外側の処理がその情報をどう取り扱うべきかという問題とは完全に直交してる
(言語ごとにある程度の慣例はあるけどあくまで慣例)
例外に変なこだわりや的外れな批判をしてる奴は大体そこを勘違いしてる
243デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
2024/02/11(日) 09:47:48.61ID:XOPhWcHA0244デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/11(日) 09:47:48.79ID:2tL2xZqD0 >>242
お前はバグのないお花畑を考えてるからそういう理想的な抽象論を持ち出すんだよ
c++の現実は道を踏み外したら即カオス
stlのコンテナのpopに返り値がない理由は知ってるか?
あのレベルの考察でソフトウェア設計している人間が世の中にどれだけいると思う?
お前はバグのないお花畑を考えてるからそういう理想的な抽象論を持ち出すんだよ
c++の現実は道を踏み外したら即カオス
stlのコンテナのpopに返り値がない理由は知ってるか?
あのレベルの考察でソフトウェア設計している人間が世の中にどれだけいると思う?
245デフォルトの名無しさん (ワッチョイ 1e27-2ki6)
2024/02/11(日) 09:55:44.37ID:2tL2xZqD0246デフォルトの名無しさん (ワッチョイ 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++はカオスなんだよ
バグのあるなしなんか関係ない設計の話だし、「例外はエラー伝達の具体的方法の一つ」って話のどこが抽象的なのかも分からないし、
「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:XOPhWcHA0248デフォルトの名無しさん (ワッチョイ 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をよくわからない計算とか言っている時点で以下略
>前半のよくわからない計算は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成分からなるわけやが……
以下の主張のどこが抽象論なのか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しない場合はその例外が通過する
呼び出し階層全部でテストをしなきゃならないってことになるが。
>例外が関数の階層をぶち抜いて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 できた方がはるかに調査しやすいと思うんだがな。感覚が違うなあ。
>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; }が大好きなんだよな
本質的にやってること変わらないのに
if (err != 0) { return -1; }が大好きなんだよな
本質的にやってること変わらないのに
256デフォルトの名無しさん (ワッチョイ eba6-IqbK)
2024/02/12(月) 15:42:15.86ID:NdUIQhSh0 ファイル名に年月が使えないの困ります。
2024/02/11_データ.txt
とか
2024/02/11_データ.txt
とか
257デフォルトの名無しさん (ワッチョイ 4b5a-nvep)
2024/02/12(月) 15:46:00.47ID:QicyHe7E0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 「アベノミクス」で投資対象と化したマンション ローンの低金利続き「年収の12倍」借りる20代出現 [蚤の市★]
- 食品の高騰対策、政府が交付金の「特別枠」検討 原則全ての自治体で [蚤の市★]
- 【超絶悲報】日本政府「高市さんの答弁撤回はない。政権として弱腰と映る姿勢は見せられない」これもう立憲岡田の議員辞職しかないだろ [519511584]
- 【実況】博衣こよりのえちえち朝こよ🧪
- 台湾「高市さんが台湾人の悲願を叶えてくれた!」これじゃ高市さん発言撤回できないぢゃん😰 [523957489]
- 高市周辺、さすがに焦り始めるww「小さな火種が火事になりかけている。早く鎮火しなくてはいけない」 [271912485]
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
