- 1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net]
- 前スレ
C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
- 792 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 08:31:29.32 ID:xpWbVnlK.net]
- 誰が「例外安全なら大丈夫」と言っているの?レス番は?
- 793 名前:デフォルトの名無しさん [2021/10/20(水) 09:12:35.95 ID:OEiI06HQ.net]
- Kuso.KENTA.
- 794 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 09:21:20.26 ID:glY3n63N.net]
- いつになっても
do { } while(0); でbreakをgoto代わりに使うしかないのか
- 795 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 09:23:08.99 ID:NMVwWGr0.net]
- >>763
めまいが
- 796 名前:キるほどのひでえコード
やめてくれバカがうつる [] - [ここ壊れてます]
- 797 名前:デフォルトの名無しさん [2021/10/20(水) 09:35:49.31 ID:OEiI06HQ.net]
- >>743
観ようとしなければ何も観えない そんな簡単なことにも気付けない
- 798 名前:デフォルトの名無しさん [2021/10/20(水) 09:39:48.17 ID:OEiI06HQ.net]
- >>757
2GB以上じゃなくて良いけど そこそこの大きさのファイルで 書き込んでcloseしてる途中に 電源OFFとかになったら例外どころじゃないんだが 最近のOSはちゃんとコンデンサ放電仕切るまでの間に書き込み終了するんだろうか
- 799 名前:デフォルトの名無しさん [2021/10/20(水) 09:44:46.84 ID:OEiI06HQ.net]
- >>760
サンフランシスコ地震で高速道路崩落←直後に「日本では起こり得ない」と言われた インドネシアの津波で街が吹っ飛ぶ←直後に「日本では起こり得ない」と言われた チェルノブイリで原発爆発←直後に「日本では起こり得ない」と言われた 武漢でコロナ感染者急増でパニック&パンデミック←直後に「日本では起こり得ない」と言われた いつも否定したがる人はいるしそれを信じたがるひともいる
- 800 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 11:10:43.38 ID:NMVwWGr0.net]
- >>778
UPSもアレスタも知らないど素人w
- 801 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 11:15:17.23 ID:glY3n63N.net]
- ファイル編集中、Ctrl+Sを押下して保存しようとした瞬間に停電になったことがある
再起動後、ファイルは存在しているのに中身は\0で埋められていたよ
- 802 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 11:16:33.48 ID:PaxGKk4c.net]
- >>778
・UPSぐらい付けろよ ・障害が心配なら多重化しとけ って話で例外安全とはレイヤーの違う話
- 803 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 11:28:28.97 ID:EqJEar1P.net]
- >>770
古典だけどExceptionalC++あたりから読み始めるのがいいよ 準拠規格が古いから所々アレだけど大きな考え方を学ぶには十分だろう 感想聞かせてね
- 804 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 11:41:33.49 ID:Px+syONf.net]
- いつもの
- 805 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 11:43:42.24 ID:BFKUlxpT.net]
- 786以降C++なコードもC++なURLも載せないやつは発言禁止な
- 806 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 12:28:18.88 ID:vkb7a42p.net]
- >>763
try内のコードが例外出さない限りcloseされない
- 807 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 12:55:58.99 ID:Px+syONf.net]
- 確かにそうだ
すっかりfinallyのつもりで読んでた やはりRAIIは正義
- 808 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:11:06.68 ID:NMVwWGr0.net]
- いーやfreadで2G超のファイルはvsでも完全にあつかえる不都合はない
と、自信を持って断言できないゴミが URL乞食でドヤってるのバカすぎ
- 809 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:28:11.75 ID:vkb7a42p.net]
- C++にもfinally欲しい
- 810 名前:デフォルトの名無しさん [2021/10/20(水) 13:30:01.90 ID:OEiI06HQ.net]
- fseek()/ftell()が32bit用でfseeki64()/ftelli64()の方を使ってないというオチか
- 811 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:36:27.87 ID:glY3n63N.net]
- 自信をもって断言したところで、モリカケ・桜を見る会と同じことになるだけだよ
アベノセイダーズは不具合を見つけてくるまで決して許さない
- 812 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:39:14.76 ID:glY3n63N.net]
- >>789
コストラクタでラムダ式をメンバ変数に受け取りデストラクタでそのラムダ式のメンバ変数を実行するクラステンプレートを自作すれば問題解決
- 813 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:41:35.24 ID:NsIIvpqv.net]
- fseekの引数はなぜああしたんだろうね
- 814 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:46:56.17 ID:glY3n63N.net]
- 宇宙人がいないことを証明するための労力たるや
- 815 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:50:04.27 ID:NMVwWGr0.net]
- 不都合があるという主張であろうと
不都合がないという主張であろうと 自分でコード書けないゴミは引っ込んでろ
- 816 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:53:43.95 ID:glY3n63N.net]
- >>795
そのとおりだな、まずお前が引っ込め
- 817 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 14:13:30.21 ID:glY3n63N.net]
- 再帰呼び出し
我々の宇宙は高度な文明を持つ知的生命体の実験により作られたものであると推測するハーバード大学の科学者 : カラパイア https://karapaia.com/archives/52306877.html
- 818 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 14:38:01.57 ID:NMVwWGr0.net]
- >>796
おいURL乞食、おまえに言ってんだよ、おまえに 俺はftellで例示するコード出してんだよ 同類呼ばわりすんな穢らわしい
- 819 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 14:47:18.86 ID:BFKUlxpT.net]
- #include <iostream>
#include <fstream> #include <vector> #include <cstdio> #include <algorithm> int main() { const char path[] = { "hoge.dat" }; std::vector<char> buffer(1024 * 1024); // 1MB std::ofstream f(path, std::ios::binary); for (int gb = 0; gb < 5; ++gb) { std::fill(buffer.begin(), buffer.end(), static_cast<char>(gb)); for (int i = 0; i < 1024; ++i) f.write(buffer.data(), buffer.size()); } f.close(); #pragma warning(suppress : 4996) std::FILE* fp = std::fopen(path, "rb"); for (int i = 0; i < 5 * 1024; ++i) { if (std::fread(buffer.data(), sizeof(buffer[0]), buffer.size(), fp) < buffer.size()) return 1; for (auto ch : buffer) if (ch != static_cast<char>(i / 1024)) return 2; } std::fclose(fp); std::cout << static_cast<int>(buffer[buffer.size() - 1]) << std::endl; return 0; } とりあえずVC++2019でx86(32bit)ビルドして実行したら終了コード0の出力4だったのでfread 4GBは超えられてる模様
- 820 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:12:34.13 ID:glY3n63N.net]
- >>799
それは、おま環にすぎないので不具合がないことの証明にはならない 不具合を見つけるのがお前の責務だ 赤木さんのように自○したくなるまで頑張って探せ
- 821 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:18:25.38 ID:BFKUlxpT.net]
- 今日は2つのIDで頑張ってるみたいだね
- 822 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:29:22.63 ID:NMVwWGr0.net]
- プログラム技術板の正規メンバに
クソ以外の乞食が何か寝言ぬかしとんな
- 823 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:34:29.03 ID:glY3n63N.net]
- お前らの家の冷蔵庫にエルビス・プレスリーがいないからといって、この世にエルビス・プレスリーがいないことの証明にはならないんだよ
血を吐くまで探せ
- 824 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:55:06.91 ID:4r95dvH8.net]
- 不具合あるのを証明したほうがてっとりばやい
- 825 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 16:02:32.88 ID:glY3n63N.net]
- あぁ?わかって言ってんのか?
泥棒の証拠を泥棒に探させるのがアベガー品質だぞ
- 826 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 16:09:49.79 ID:Px+syONf.net]
- 元々>>637がC++でもfgetsを使う俺は天才などとのたもうて
>>687がFILE*を使うなら例外安全をどう保証するのという話だったのが、 当の>>637は>>691でfread/fgets自体が例外を投げる可能性(?)という謎の問題を考え始め >>710が根拠不明の2GB制限の話を持ち出し 問題があると考えるひとは存在しない2個の問題を同時に考えて混乱し まあまあ分かってる人はRAIIすればいいじゃん(ってかfstreamでいいじゃん)で話が終わっている まとめるとこんなところか?
- 827 名前:デフォルトの名無しさん [2021/10/20(水) 16:17:28.71 ID:glY3n63N.net]
- 挙証責任をガン無視できる文部科学省元事務次官前川喜平こそ最強
座右の銘は面従腹背、ライフワークは貧困調査
- 828 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 16:39:46.06 ID:NMVwWGr0.net]
- キチガイ極左は内ゲバで共食いしとれ
- 829 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 00:40:30.45 ID:ObBh/r
]
- [ここ壊れてます]
- 830 名前:k9.net mailto: >>806
俺はcの標準ライブラリ使うならosの関数使えって言ってた人でアンカの中には登場しない人だけど 「根拠不明の2GB制限」についてはlarge file問題というのが昔あった https://en.wikipedia.org/wiki/Large-file_support LinuxなどUnix系が64bit環境にほぼ移行した現在その問題はレアケースだとは思うけど 32bitアプリが割と残っているWindowsだと実際のところどうなのか分からない でもfreadくらいは出来そうだと考えわざわざコード書いただけ(>>799) ちなみにLinuxでもdebian系のantiX 19.4 32bit環境では#define _FILE_OFFSET_BITS 64がないとfopenがNULLを返していた [] - [ここ壊れてます]
- 831 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 00:51:53.61 ID:l0SlZ35R.net]
- 話の肝は「私が間違ってました。ごめんなさい」と素直に言えるかどうかなわけで
小室文書みたいな屁理屈の羅列はいらねンだわ
- 832 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 01:06:38.58 ID:5bux1k1I.net]
- >>807
NHK は メード イン ジャパン とか オーダー メード とか表記するのに メイド 喫茶は なぜ メイド 表記なのですか?
- 833 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 01:19:29.04 ID:ObBh/rk9.net]
- ちなみに>>809の「cの標準ライブラリ使うならosの関数」という意味で以前実験した結果も貼っとく
read, fread, std::ifstream::readの比較 https://ideone.com/H2jc7B systemdのユーザーごとのRAMディスクを使っているのでそれがある環境でだけ動作する ubuntu 20.04 64bit環境で実行した結果だと↓ $ g++ -O2 test.cpp -o test $ ./test 227 267 225 $
- 834 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 03:46:14.13 ID:Y6x8PTxQ.net]
- >>811
前者がmadeで後者がmaidだからじゃね?
- 835 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 07:45:14.90 ID:5PpYpVBN.net]
- 以前はメードだったと思うけどね
- 836 名前:デフォルトの名無しさん [2021/10/21(木) 11:19:37.65 ID:l0SlZ35R.net]
- ババ抜きはOld maidの日本語訳だよ
セクシズムやエイジズムはポリコレの立場から見てどうだろうね
- 837 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 12:39:37.82 ID:u1ltZUWw.net]
- regexで\dを使いたい場合はどうやるん?
- 838 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 14:10:28.52 ID:ObBh/rk9.net]
- https://cpprefjp.github.io/reference/regex/basic_regex.html
- 839 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 17:33:55.95 ID:MfhbDLcG.net]
- >>812
その比較でなんで fread だけ遅いんだ?と思ってコード見たら fread じゃなくて fgets になってた。 あと read_cpp_standard() の if (std::cin.fail()) もたぶん f.fail() の間違い。
- 840 名前:デフォルトの名無しさん [2021/10/21(木) 18:24:19.20 ID:/1ln80gU.net]
- >>815
フェミが言葉狩りのネタにしないのは何故
- 841 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 18:42:48.64 ID:7ERuyWg6.net]
- 言葉狩りなんてないから
- 842 名前:デフォルトの名無しさん [2021/10/21(木) 18:56:39.47 ID:ObBh/rk9.net]
- >>818
thx >>812のコードは脳内破棄してくれ 指摘された部分を修正した https://ideone.com/DoI3ww 同環境での測定結果が↓ 214 213 214 freadだとバッファリングされるからその分遅いのかと勝手に思ってたらそんなところから間違ってたとはすまんw
- 843 名前:デフォルトの名無しさん [2021/10/22(金) 00:41:05.61 ID:bIdSm1HR.net]
- BB抜きが有ってGG抜きが無いのは差別
- 844 名前:デフォルトの名無しさん [2021/10/22(金) 00:43:55.21 ID:bIdSm1HR.net]
- >>821
fread最強でFA
- 845 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 01:17:58.50 ID:JLUkeFzw.net]
- freadのバイナリな
DMA効くのは テキストはゴミ
- 846 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 02:55:23.69 ID:ugOmuUc2.net]
- >>822
ジジ抜きもあるよ。 ジジ抜きはジョーカーを使わない。 適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。 どれが負け札なのか最後までわからないというのがゲームの面白い部分。 ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、 ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
- 847 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 05:43:15.83 ID:I4IH0MDY.net]
- C++20ちょっと書き始めたらvscodeのインテリセンスが何でもないところにエラーの波線出しまくってくる
- 848 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 07:07:31.23 ID:viI1I/mh.net]
- DMAか、懐かしい
- 849 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 12:50:15.03 ID:xpSH/+fs.net]
- >>826
どの環境でそうなる?
- 850 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 13:37:10.17 ID:I4IH0MDY.net]
- >>828
OS: Windows 8.1 (64 bit) コンパイラ: MinGW GCC 11.1.0 文句を言ってくる拡張機能は多分普通の"Microsoft C/C++ 拡張機能"でコードの例としては https://wandbox.org/permlink/Fcqjvfqt8rWVqren こんな感じ エラーは operator<=>: 戻り値の型だけで識別される関数はオーバーロードできません requires(1個目): こちらでは requires 句は許可されていません (テンプレート関数ではありません) vec: エイリアス テンプレート "vec" の引数リストがありません v: ';' が必要です という感じ まあエイリアスのやつはC++17でも言えるけど
- 851 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 23:23:13.68 ID:Q/4+pM2R.net]
- Pythonのリストのように不定型の配列を作るにはどうすればいいですか?
vector<int> a; vector<double> b; vector<vector<any>> hoge; hoge.emplace_back(a); hoge.emplace_back(b); みたいなことをしたいですが、エラーになりました。 最終目的は、 void f(vector<vector<any>>, vector<vector<any>>) のような不定型配列を複数引数に取る関数を作りたいです。
- 852 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 23:45:34.05 ID:vgFDGRgE.net]
- std::variantつかうとか
- 853 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 01:05:44.90 ID:UQ/XjfNb.net]
- >>830
出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。 std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。 格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
- 854 名前:ハノン mailto:sage [2021/10/23(土) 01:33:33.73 ID:0KDU0Kot.net]
- >>830
C++17以降、へえ、こんなこともできるんだ… https://cpprefjp.github.io/reference/variant/variant.html https://ideone.com/G8IPFR >>831 ありがとうございます!
- 855 名前:ハノン mailto:sage [2021/10/23(土) 01:34:50.09 ID:0KDU0Kot.net]
- >>832
うん、実用に供するまでには結構大変そう、使い道がわからん…
- 856 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 01:57:47.58 ID:UQ/XjfNb.net]
- >>834
クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが 旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、 そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。 根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら 少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
- 857 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 08:10:22.62 ID:LycCK1PV.net]
- void*よりはちょっとマシって程度の感覚だな
- 858 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 10:04:52.59 ID:rMqegMI3.net]
- >>832
その後の使い方は、基本的には 全要素をany_castでstringにして使うつもりです。 不定型可変長のデータを受け取ってcsvファイル出力に使いたい感じです。
- 859 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 10:05:50.17 ID:bwy1yWHL.net]
- void*「むかしはあんなに愛してくれたのに…」
- 860 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 11:08:12.01 ID:FGy8rv7m.net]
- >>830
any使うんだったら、 vector<vector<any>> hoge; じゃなくて vector<any> hoge; じゃない?
- 861 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 11:40:12.00 ID:KcnUiVki.net]
- >>835
>>833じゃないけど>>833のdump()を例えば template<class... Args> void dump(const std::variant<Args...>& e) { std::visit([](const auto& x){ std::cout << " " << x << std::endl; }, e); } template<class V> void dump(const std::vector<V>& v) { for (const auto& e: v) { dump(e); } } みたいにするんなら class Dumpable { virtual void dump() = 0; }; みたいな抽象クラス作って素直にArgsの各classが継承(実装)した方がいいと思うってこと?
- 862 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 13:07:50.50 ID:UQ/XjfNb.net]
- >>840
そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、 クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。 型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。 (最終的には typeid が導入されてしまったけど……) ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、 十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
- 863 名前:デフォルトの名無しさん [2021/10/23(土) 13:12:23.67 ID:quaWTEll.net]
- C++はパラメトリック多相が無いからこういうのは面倒だよね。
とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); }; あたりを入れとくのが簡単かね。 conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。 concept_shared_ptrとか用意してくれんかね。
- 864 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 13:16:46.64 ID:UQ/XjfNb.net]
- >>837
any_cast での取り出しは「元の型」でなければならず、 string に変換可能な型であっても any_cast<string> は出来ない。 (やったら例外が飛ぶ) 最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
- 865 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 14:23:02.68 ID:KcnUiVki.net]
- >>841
まあそうだよね。ありがとう。
- 866 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:17:03.78 ID:mo2+vXTQ.net]
- >>771-772
以下のような場合についてBarクラスがRAIIであるというだけでどう例外安全にできるのかお考えをお聞かせ願えますか void foo() { { // 何かのコードブロック (try { } catch { } のtry{ } とかでも良い Bar x, y, z; (例外を生じる可能性があるコード) アプリケーション固有の別スレッドXにイベントなりシグナルを送る } } >>723 上に書いたようなケースを踏まえてっ例外安全に言及している>>720と>>721に対して 理解しいないまま捨て台詞を残して逃走した>>722とか、
- 867 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:20:03.55 ID:mo2+vXTQ.net]
- >>772
コードブロック内のreturnがあるかもしれないんならチェックすれば良いやん? >>763は普通の人ならチェックするでしょ、という主張 ところが>>722のような例外安全主義者ときては、RAII = 例外安全、で脳がショートしているのや 多分周りも能力に忖度して大した課題を与えていないんだと思う
- 868 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:40:20.31 ID:i4dOTOfz.net]
- 上では例外安全にするとかしないとか言っていたような気がしたが少し主張が変わったのかな。
- 例外安全を求めるのは当然 - RAIIを使えば比較的例外安全を保証しやすい - だからといってRAIIを使えば自動的に例外安全になるわけではない 結論としてはこんな感じだと思うが。
- 869 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:41:27.07 ID:7jz7Y9vl.net]
- チェックして例外出さないと解放されないコード書いたのか…
- 870 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 09:13:23.68 ID:1SVJ9Wvp.net]
- そりゃ例外安全もRAIIも魔法じゃないんだから使えば即安全になるというわけじゃないわな
「ちゃんと使えば」をすっ飛ばして>>845みたいなことを言い出すのも一種の思考停止だろうと思うわ
- 871 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 09:51:02.52 ID:v4numFpL.net]
- >>845
Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話 逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
- 872 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:24:44.80 ID:P2kmr3bK.net]
- そもそもRAIIが例外安全のためっていうイメージ全くないんだけど
リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
- 873 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:36:38.75 ID:i4dOTOfz.net]
- 例外が発生するとリソースを片付け損ねる場合があるってのが例外安全を欠く一番よくあるケースだと思うけど。
主目的がどうとかは別として。
- 874 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:45:51.44 ID:NLtlOSxj.net]
- >>845
例外を生じた場合でもXとなんらかの通信を行うべきなら thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな 「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく 例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
- 875 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:47:45.55 ID:KyFc3YJo.net]
- 結局コードがないのでまた空中戦になってますね
- 876 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 11:38:44.49 ID:IQSwOnqn.net]
- 例外でデストラクタ呼ばないケースなんてあるんですか?
プログラム自体が止まるのは別として
- 877 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 12:07:45.68 ID:KyFc3YJo.net]
- リマインダー>>731
- 878 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 14:38:53.43 ID:KyFc3YJo.net]
- これg++ 9.3だとstd::endlがなぜかconst variant<>と思われてエラーになってるみたいなんだけど、なぜ?
#include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl; return 0; } https://godbolt.org/z/dbodW3xfG
- 879 名前:ハノン mailto:sage [2021/10/24(日) 15:13:35.43 ID:rOnHPdOM.net]
- >>838
「「最初から void * な実体」は作らない」「void (*)(void *, ...) くらいまでがせいぜいだ」というように努めていた私は愛し方が足りなかったのでしょうか? 最近の愛し方:https://mevius.5ch.net/test/read.cgi/tech/1624028577/305
- 880 名前:はちみつ餃子 mailto:sage [2021/10/24(日) 18:37:46.86 ID:SzIAMYLD.net]
- >>857
std::endl は関数テンプレートなので型と比較しようとするとインスタンス化に失敗するというエラーだと思う。 (std::endl を普通に使うときは左辺の型を利用して推論される。) 型を明示して渡せば variant との比較に失敗して通常の改行として解釈してくれる。 #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << static_cast<std::ostream&(*)(std::ostream&)>(std::endl); return 0; }
- 881 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 19:35:48.44 ID:KyFc3YJo.net]
- >>859
う〜ん、よく分かりませんね。確かに勝手にendlは[with _CharT = char; _Traits = std::char_traits<char>]なbasic_ostreamを 引数にとって返すと想定しちゃってましたが、その時点でインスタンス化しようとしてエラー出す理由が分からない・・・ 例えばテンプレート引数を直指定しても #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl<char>; // ここが違う return 0; } 同様にエラーのままでした。castしたときだけなぜ判定失敗してくれるのかもう少し考えてみます。 ありがとうございました。
- 882 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 00:43:36.43 ID:dRHq7DJG.net]
- >>860
左辺が曖昧だからかもしれない。 左辺の型を std::ostream で固定すれば通る。 #include <variant> #include <iostream> using namespace std; template<class C, class... Args> std::ostream& operator<<(std::ostream& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl<char>; return 0; } でもこのとき型変数 C は不要だなと思って class C を削るとエラーになるんだよな。 なんだかよくわかんないね。
- 883 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 02:18:03.94 ID:LmZJdmU+.net]
- >>861
度々ありがとうございます。再現確認したところ、確かに余計なテンプレート引数が1つあるだけでこのエラーが出ないみたいですね。 試しに元のコード(>>857)に余計なパラメータを1つ入れるだけでも通りました。 #include <variant> #include <iostream> using namespace std; template<class T, class C, class... Args> // ダミーパラメータT追加 C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl; return 0; } ほんとによく分かりませんね。 castの件は第2引数のvがテンプレート関数でなければ弾けるということのような気がします。 https://onlinegdb.com/ol3BYChIx
- 884 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 02:19:56.83 ID:LmZJdmU+.net]
- 最後のコードは右上の設定ボタンから -std=c++17 を追加することで実行できます。
- 885 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 13:57:01.70 ID:p1HT8A4i.net]
- iostreamのシフト演算子オーバーロードは文句を言われてるがrangesのoperator|のオーバーロードはどうなんですかね
- 886 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 14:01:06.87 ID:dRHq7DJG.net]
- 感覚的にはまあ順当だろうと思う。
日付やパスで / を使うのに比べればよっぽど……。
- 887 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 15:38:37.13 ID:x4U5y7kU.net]
- 組み込みの意味を持たないオーバーロード専用演算子があれば良かったのにな
用意しておかなかったのはC++の初期デザインの失敗だったと思う
- 888 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 16:09:42.75 ID:SLeimCOK.net]
- 意味を持たない演算子が意図せず呼ばれてしまうくらいならコンパイルエラーになったほうがマシでは
- 889 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 17:28:55.78 ID:dRHq7DJG.net]
- ところで Haskell で一定の記号の組み合わせは何でも新しい演算子として定義できる仕組みがある。
!#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。 優先順位も決められるし左結合か右結合かも決められる。 事実上無制限に違う字面の演算子を作れるんだよ。 <?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。 こういう極端なのはさすがにあまりうらやましくはないよな……。 >>866 かといって有限の演算子をある程度に多く用意したところで
- 890 名前:オーバーロードを許すなら
どこかで全然違う意味で使われることもあるのは避けようがないし、 C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。 [] - [ここ壊れてます]
- 891 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 17:51:03.08 ID:s1VnbLSn.net]
- 演算子ってのはwellknownだからこそ意味があると思うんだけどな
演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし 意味を持たないオーバーロード専用演算子ってのは プログラマーによって意味が真逆になりかねないから危険だと思う そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
- 892 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 17:56:20.95 ID:5fKOgArh.net]
- そこら中訳わかんない記号だらけのソースとか悪夢でしかないなw
|

|