1 名前:sage [2022/10/31(月) 14:29:35.57 ID:J5sgTSch0.net] !extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ↑同じ内容を3行貼り付けること 次スレは>>980 が立てること 無理なら細かく安価指定 ※前スレ C++相談室 part161 https://mevius.5ch.net/test/read.cgi/tech/1653135809/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
152 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 00:44:42.87 ID:P8Ivr6rPa.net] >>144 プロジェクト作ればいいよ
153 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 00:50:02.83 ID:g3O9ReAZM.net] >>143 142と143の間に、次の記述が挟まっています。 So: string x {"There and back again"}; Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"} Xref<string> r2 {9,x}; // r2 just refers to x Xref<string> r3 {3,new string{"There"}}; // r3 owns the string{"There"} Here, r1 picks Xref(int,string&&) because x is an rvalue. Similarly, r2 picks Xref(int,string&) because x is an lvalue. Lvalues and rvalues are distinguished by template argument deduction: an lvalue of type X is deduced as an X& and an rvalue as X. This differs from the binding of values to non-template argument rvalue references (§12.2.1) but is especially useful for argument forwarding (§35.5.1). Consider writing a factory function that make Xrefs on the free store and returns unique_ptrs to them:
154 名前:デフォルトの名無しさん [2022/11/16(水) 00:50:03.82 ID:85X5ndMu0.net] >>147 ありがとうございます やってみます
155 名前:はちみつ餃子 mailto:sage [2022/11/16(水) 00:51:20.49 ID:eOApcCVI0.net] >>137 文字列リテラルが lvalue なのはややこしい解釈の余地はなく直接的に明記されている。 https://timsong-cpp.github.io/cppwp/n3337/expr.prim.general#1 少なくとも > "Here"は右辺値なので というのは確実に誤った記述だよ。 最初の段階で誤っているのだからそこから後の理屈の立て方に筋が通るはずがない。 >>148 A は string に決定されない。 そういう仕組みは無いのでそれを前提として考えるな。
156 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 01:10:00.99 ID:g3O9ReAZM.net] >>152 >A は string に決定されない。 >そういう仕組みは無いのでそれを前提として考えるな。 なるほど。しかし、だとすれば、 「Consider: auto p1 = make_unique<Xref<string>>(7,"Here"); "Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here".」 の部分はどう説明できますか?
157 名前:デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ) mailto:sage [2022/11/16(水) 01:14:18.30 ID:g3O9ReAZM.net] >>153 今思ったんですが、もしかしたら、 >Consider: auto p1 = make_unique<Xref<string>>(7,"Here"); の部分が、 Consider: auto p1 = make_unique<Xref<string>>(7,string{"Here"}); の書き間違いだったのかもしれませんね。 なお、直接関係有りませんが、>>150 の >Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"} >Here, r1 picks Xref(int,string&&) because x is an rvalue. は、確認しましたが、kindle版は確かに正確にこう書かれていますが、 このr1の定義部分に「x」は存在しておらず、代わりに"Here"が存在していますので そこも書き間違いかも知れません。
158 名前:デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ) mailto:satge [2022/11/16(水) 01:26:05.39 ID:g3O9ReAZM.net] もしくわ、 >auto p1 = make_unique<Xref<string>>(7,"Here"); は、 auto p1 = make_unique<Xref<string>,string>(7,"Here"); と書きたかったのでしょうか。つまり、もし、 auto p1 = make_unique<Xref<string>>(7,string{"Here"}); または、 auto p1 = make_unique<Xref<string>,string>(7,"Here"); と書いてあったならば、辻褄が合いそうです。
159 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 05:12:39.73 ID:c3tWnPnh0.net] 文字を反転させる関数を作っているのですがうまく行きません voidの部分がおかしいと思うんですが正直手詰まりです 誰か解決策はありますでしょうか 実行するとrevarce関数が飛ばされて終了してしまいます void revarse(char* p, char* r); int main(void) { char str1[64]; char str2[64] = {}; printf("文字列を入力\n>>"); scanf("%s", str1); revarse(str1, str2); printf("%s", str2); rewind(stdin); getchar(); return 0; } //反転させる関数 void revarse(char* p, char* r) { int len = strlen(p); for (int i = 0; i <= len / 2; i++) { *(r + i) = *(p + (len - i)); } }
160 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 05:28:39.68 ID:PEnRRRQh0.net] おい、もうテメーの日記帳に書いとけや
161 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 05:33:02.42 ID:5+x4ry0S0.net] >>156 文字列pが "12345" だとして考えてみ? len=5 だろ? *(p + (len - i)); これって i=0 の時 *(p + (5 - 0)) => *(p + 5) ってことになる ゼロベースだからインデックス5にはNULL文字'\0'が入っている それを*r にコピーしている つまりコピーされるのは常に長さ0の文字列 そりゃ出力したってなにも表示されないさ あとlen / 2はおかしいだろ 練習するならマルチバイトはまず置いておいてシングルバイト文字のみ扱え
162 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 05:50:25.16 ID:c3tWnPnh0.net] >>158 ありがとうございます! 助言道理に直したら無事に反転させることができました! 本当にありがとうございます! 精進します!
163 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 06:49:36.90 ID:f7msq55Zd.net] 実習問題臭いのが気になる
164 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 08:13:10.02 ID:6xMrEJ8a0.net] int と N 要素の vector<double> から N+1 要素の tuple<int, double, double,...> を作る方法ってありますか
165 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 08:25:10.43 ID:Nbbm6FAB0.net] Nがコンパイル時に決まってないと無理
166 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 13:34:55.97 ID:DtzZSdSg0.net] >>152 証拠の壁画が出てきた https://i.imgur.com/9aiVMvr.png
167 名前:はちみつ餃子 mailto:sage [2022/11/16(水) 13:42:47.25 ID:eOApcCVI0.net] >>163 何の証拠?
168 名前:デフォルトの名無しさん mailto:sage [2022/11/16(水) 13:43:50.52 ID:DtzZSdSg0.net] わからん
169 名前:はちみつ餃子 mailto:sage [2022/11/16(水) 14:24:03.96 ID:eOApcCVI0.net] >>142 よく見るとデータメンバの名前が owned なのに初期化のほうでは owner になってるな。 実際にコンパイルしてみようとして気づいたわ。
170 名前:デフォルトの名無しさん [2022/11/16(水) 17:43:24.39 ID:z+sJwdsYa.net] >>144 >>147 が正解だが Readme.txt も読んだか?
171 名前:はちみつ餃子 mailto:sage [2022/11/16(水) 17:43:42.62 ID:eOApcCVI0.net] >>148 clang に抽象構文木を見る機能があるのを思い出した。 それを通したらこんな感じ。 https://wandbox.org/permlink/NNaci7k0QcpFXc9G 表示の正確な読み取り方はワイも知らんのやが lvalue "Here" と出てるのはわかるし、 関数に渡したときに const char (&)[5] として受け取られているのはわかるやろ。
172 名前:デフォルトの名無しさん [2022/11/16(水) 17:47:22.63 ID:z+sJwdsYa.net] >>161-162 Nim
173 名前:デフォルトの名無しさん mailto:sage [2022/11/19(土) 11:03:08.07 ID:GrOHAxDN0.net] >>161 vectorの取りうるサイズがある程度決まってるのなら 予めdoubleの数が異なるtupleを用意しておくという手はある #include <iostream> #include <any> #include <vector> #include <tuple> using namespace std; using Vector = vector <double>; using Int_Double_1 = tuple <int, double>; using Int_Double_2 = tuple <int, double, double>; any make_tuple_from_int_vector (int p0, const Vector &p1) { if (p1.size () == 1) return make_tuple (p0, p1 [0]); else if (p1.size () == 2) return make_tuple (p0, p1 [0], p1 [1]); else return any (); } int main () { Vector v1 (1, 10); Vector v2 (2, 100); auto v3 (any_cast <Int_Double_1> (make_tuple_from_int_vector (1000, v1))); auto v4 (any_cast <Int_Double_2> (make_tuple_from_int_vector (10000, v2))); return 0; }
174 名前:デフォルトの名無しさん [2022/11/19(土) 16:17:21.48 ID:F8GIHVyHa.net] 本当の目的を聴きたい
175 名前:デフォルトの名無しさん [2022/11/19(土) 19:46:58.80 ID:IQ1PkgMa0.net] true &&false計算するのと1&&0計算するのはどっちが早いとかある?
176 名前:デフォルトの名無しさん [2022/11/19(土) 19:50:29.13 ID:o7Lf802R0.net] はちみつもたまには役に立つな。 褒めてつかわす。 下がって良いぞ。
177 名前:デフォルトの名無しさん mailto:sage [2022/11/19(土) 23:24:23.61 ID:G53M1f4ia.net] >>172 trueは1なので同じです
178 名前:はちみつ餃子 mailto:sage [2022/11/20(日) 00:27:52.78 ID:RgPem6BD0.net] >>172 オペランドがリテラルならコンパイル時に畳み込まれるので同じ。 そうではなく型による差について問うているのなら 少なくとも現代的な処理系・実行環境だとまず差は出ないよ。 うまいこと最適化されてそんな差はどうでもよくなる。 言語仕様通りの素朴な解釈だと両オペランドを
179 名前: bool に型変換するという工程が入るので int の && のほうが余計に処理をすることにはなるが……。 ちなみに C と C++ では規則が違うので詳細を調べるなら混同しないように注意。 (文言は違うけど結果的な挙動はほぼ差はないんだけど。) [] [ここ壊れてます]
180 名前:デフォルトの名無しさん mailto:sage [2022/11/20(日) 13:22:48.35 ID:9/YCbfcZM.net] >>172 どちらも、最適化されれば false(偽) になって同じコードになる。
181 名前:デフォルトの名無しさん mailto:sage [2022/11/20(日) 13:29:22.75 ID:9/YCbfcZM.net] >>176 [補足] 最適化には高レベルから低レベルまでさまざまな層で行なわれる。 高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い コードになる。 && や || は、シーケンスポイントがあり A && B は A が偽ならば B を評価しないし、 A || B は、A が真なら B を評価しないので、マシン語レベルで条件 jump 命令が 生成されることが有るが、&& や || は、「高レベル」でも最適化する方法が 知られているので、このような場合、条件 jump 命令が生成されない。 また、仮に高レベルでは条件 jump 命令が生成されてしまった場合でも、 低レベルで最適化する際に、必ず真になったり必ず偽になるような条件 jump は、 無条件jumpになったり、削除されたりする。 そして、直後の命令への無条件 jump は、削除される。 二段階の無条件 jump は一段階の jump に修正される。 このような最適化を何度も何度も繰り返すので、結果的に同じことをするコードは、 同じコードになることが多い。
182 名前:デフォルトの名無しさん mailto:sage [2022/11/20(日) 13:42:45.47 ID:9/YCbfcZM.net] >>177 誤:最適化には高レベルから低レベルまでさまざまな層で行なわれる。 正:最適化は高レベルから低レベルまでさまざまな層で行なわれる。 誤:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い 正:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで修正されて短い
183 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 08:37:00.41 ID:JLBL5Nrvd.net] windowsでstd::create_symlinkを使おうとすると 特権がいるって言われるけど、何でそんな決まりになってんの? mklinkコマンドも特権モードじゃないとシンボリックリンク作れないし それのどこがそんなに危険な操作なのか理解に苦しむ
184 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 09:20:47.14 ID:+RKYLIKe0.net] 権限のないディレクトリにシンボリックリンクを作ろうとしてるのでは?
185 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 09:57:07.23 ID:ROGUGHEjd.net] C:じゃないHDDだし俺専用PCだし 所有権でややこしいことにはなりっこない
186 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 10:05:16.45 ID:emKQg5jla.net] 特権の問題じゃなくて変なもん作ろうとしとる
187 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 10:21:25.02 ID:5norvibI0.net] ディレクトリの権限関係なくWindows のシンボリックリンクの作成自体に管理者権限が必要、理由は知らん ディレクトリにリンク張るならジャンクション(こっちは管理者権限不要)使えってことかも ジャンクションの作成はコマンドからならmklink /jで行けるけどコードからやるのはちょっと面倒みたい https://stackoverflow.com/questions/29291059/issue-creating-windows-ntfs-directory-junction-in-c-c
188 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 16:05:23.29 ID:glPNIX2fd.net] 一般人に使わせるとショートカットと混同して危険だからそうしてるってどっかで見た 何が危険なのかは分からなかった
189 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 16:27:39.36 ID:tXIkHCtk0.net] >ユーザー権利を持つユーザーは、誤って、または悪意を持ってシステムをシンボリック リンク攻撃に公開する可能性があります。 >シンボリック リンク攻撃は、ファイルのアクセス許可の変更、データの破損、データの破棄、または DoS 攻撃として使用できます。 というのが、Microsoft の公式見解
190 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 16:40:48.
] [ここ壊れてます]
191 名前:52 ID:+RKYLIKe0.net mailto: >>185 読んでもサッパリ分からん なんすか? その「シンボリックリンク攻撃」って? それUNIXでは生じないの? [] [ここ壊れてます]
192 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 16:44:11.97 ID:5norvibI0.net] >>185 これソースある? シンボリック経由でファイルやフォルダーの権限って変わるんだっけ?
193 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 16:48:44.26 ID:tXIkHCtk0.net] シンボリック リンクの作成 (Windows 10) - Windows security | Microsoft Learn https://learn.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/create-symbolic-links
194 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 17:02:07.48 ID:5norvibI0.net] >>188 リンク先には攻撃方法は書いてないな シンボリックリンク攻撃 でググるとこれが出てきた 特にWindows特有というわけじゃなさそう、て言うかWindowsは/tmpみたいな誰もが共通的に使うディレクトリはないからより攻撃は難しそうだが https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html
195 名前:デフォルトの名無しさん [2022/11/22(火) 19:09:40.02 ID:zDRYE0v60.net] 他の人の書いたコードを読み解いています。 下の例では、キーが押されたら何かを切り替えてるのはわかるのですが、ここで使われている ・0xFの意味 ・(1 << 0)などの右シフト? がどういう使われ方をしてるのかが分からないので知りたいです。 16進数で掛け算して値を使っているのでしょうか? 単純な1,2,3,4などの数値で切り替えていないのも意図がよく分からないのでずが深い意味はありそうでしょうか? // VIEW_MESH | VIEW_IMAGE | VIEW_PLOT | VIEW_LM int _viewMode = 0xF; enum { VIEW_MESH = (1 << 0), VIEW_IMAGE = (1 << 1), VIEW_PLOT = (1 << 2), VIEW_LM = (1 << 3) }; switch (key) { case 'i': _viewMode ^= VIEW_IMAGE; break; case 'l': _viewMode ^= VIEW_LM; break; case 'm': _viewMode ^= VIEW_MESH; break; }
196 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 19:21:19.72 ID:3Sn7h5kH0.net] >>190 >・0xFの意味 16進数、10進数の15、2進数の1111 > ・(1 << 0)などの右シフト? 左シフト、1 << 0に関して言えば0ビットシフトなのでつまりシフトしない、二進数で0001、10進数で1 (1 << 1)は1ビット左にシフトなので二進数で0010、10進数で2 (1 << 2)は2ビット左にシフトなので二進数で0100、10進数で4 (1 << 3)は3ビット左にシフトなので二進数で1000、10進数で8
197 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 19:40:28.84 ID:3Sn7h5kH0.net] >>190 ^= は複合代入演算子 _viewMode ^= VIEW_IMAGE は _viewMode = _viewMode ^ VIEW_IMAGE と同じ ^ は排他的論理和(ビットXOR)、二進数で 1001 ^ 1100 は 0110 になる、要はビットが同じなら偽、異なっていれば真という演算 >case 'i': _viewMode ^= VIEW_IMAGE; break; _viewModeには1111が代入されている、VIEW_IMAGEは0010 1111 ^ 0010 は 1101 になる その演算結果1101を_viewModeに代入する 一連のコードはビットをフラグとして扱っていて、初期値として全フラグを立たせ、keyに対して特定のフラグをへし折っている
198 名前:デフォルトの名無しさん [2022/11/22(火) 20:24:07.39 ID:zDRYE0v60.net] >>191 >>192 ありがとうございます なるほど!フラグをへし折っているのですね納得です
199 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 22:10:58.50 ID:TSfOUCtJ0.net] 論理演算とか知らない奴がプログラムやっているんだな・・・
200 名前:デフォルトの名無しさん [2022/11/22(火) 22:14:00.95 ID:+RKYLIKe0.net] 始めたばっかりなんでしょ ビットをフラグとして使うとか最初は面食らったな
201 名前:デフォルトの名無しさん [2022/11/22(火) 22:48:40.37 ID:s23xOfAqp.net] ファミコンでもあるまいし、いまどき1ビットに意味をもたせなんて、通信制御くらいしか思い付かないなぁ
202 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 23:01:34.34
] [ここ壊れてます]
203 名前: ID:tXIkHCtk0.net mailto: マシン語のレベルで、演算結果を示す幾つかの1ビットデータがあって それらにキャリーフラグ、ゼロフラグなどの名前が付いてたのが呼び方の元 [] [ここ壊れてます]
204 名前:デフォルトの名無しさん [2022/11/22(火) 23:04:06.68 ID:s23xOfAqp.net] 恋愛ゲームのフラグと同意語だよな
205 名前:デフォルトの名無しさん [2022/11/22(火) 23:10:53.75 ID:+RKYLIKe0.net] flagでしょ 大元は手旗信号
206 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 23:22:36.31 ID:5norvibI0.net] >>196 経験値が低いだけだろ APIとか使ってたら普通に使うわ
207 名前:デフォルトの名無しさん [2022/11/22(火) 23:49:48.37 ID:s23xOfAqp.net] >>200 そうか?普通#defineされてる名前を使うからあんま意識しないよ?
208 名前:デフォルトの名無しさん mailto:sage [2022/11/22(火) 23:59:07.88 ID:tXIkHCtk0.net] 後方互換性や制御系の都合かもね
209 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 00:01:47.87 ID:6zcmIvp36.net] >>201 defineされてようが複数のフラグをand/or で繋いだりするのは桁で管理してるからじゃん
210 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 00:20:21.73 ID:E00oDXjza.net] chmodとかどうやってんの
211 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 00:43:41.07 ID:cGYFLLo00.net] さっきのビット演算、XOR 使うってことは key によって特定のビットをトグルで ON/OFFする処理 の一部を抜粋した様に見える
212 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 05:44:17.85 ID:agXFLOTv0.net] >>196 ご冗談を
213 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 08:43:03.58 ID:g5bfG+kA0.net] >>201 複数フラグを同時に使う時は FlagA | FlagB とかやるんだが意識してないお前はどうやってるんだ?w
214 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 09:08:55.00 ID:a3Z+vFOW0.net] >>192 >二進数で 1001 ^ 1100 は 0110 になる いまさらだけどここ間違えたわ 「二進数で 1001 ^ 1100 は 0101 になる」が正しい
215 名前:はちみつ餃子 mailto:sage [2022/11/23(水) 10:34:19.99 ID:TBut/iDU0.net] 現代的な C++ なら std::byte とか std::bitset を使って欲しいところではある。
216 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 12:32:20.17 ID:A/L1k8HF0.net] std::byte なんてあるんだ
217 名前:デフォルトの名無しさん [2022/11/23(水) 12:34:44.63 ID:DxhXFxCJa.net] istringstreamとかifstreamとかistreamとか 入力系からreadした場合実際に読めたバイト数は .gcount()で取得出来ますが ostringstreamとかofstreamとかostreamとか 出力系にwriteした場合実際に描き込めたバイト数はどうすれば取得出来ますか? .pcount()とかは無いようです
218 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 12:40:51.08 ID:fdWr7Y/z0.net] writeに文字数与えてるだろ?成功したらその数だよ 失敗したら未定義
219 名前:デフォルトの名無しさん [2022/11/23(水) 12:46:45.47 ID:DxhXFxCJa.net] Nを指定して成功していたら必ずNは判りますが 未定義: 失敗したとき0かどうかは判らない 定義済(0): 0からNの間の値になる可能性は無い の未定義にあたるということですかね 途中までならその途中までの数字が知りたいと思うのは不自然? ありがとうございます
220 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 13:01:17.94 ID:KaofbnpA0.net] write(2)じゃなくてfputs(3)に相当するから 書き込んだバイト数なんて概念はないのでは
221 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 13:59:19.61 ID:fdWr7Y/z0.net] 書き込みエラーなんてプログラムからは何が起きてるかわかんないんだよ 最悪壊れかけのディスクにちょうどトドメ刺して何もかも吹っ飛んだのかもしれない エラーが起きた時点でプログラム側で保証できることなんてほとんどないし、たまたま途中の何文字まで書けたかなんて大抵は無意味な情報 逆に読
222 名前:ン込みで何文字読んだって情報は、プログラム側で管理してるメモリの話だからプログラムからも分かるし必要でもある [] [ここ壊れてます]
223 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 14:04:25.04 ID:8VVNMMLlr.net] テキストアライメント関係の 始端よせ/中央/終端よせ の類で 0~3の 2 bit値を ビットパターンマスクの途中に織り込んでくるのはどっきりする
224 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 23:37:54.49 ID:t8T/jR0m0.net] 質問なのですがenum class初心者なのですが enum classはint以外の整数型としても定義できるそうなので 整数型への自動変換ぐらいしてくれるのかと思いきや、 enum Foo { A, B, C, D, N }; int arr[Foo::N]; arr[Foo::A] = 1; arr[Foo::B] = 999; みたいに配列の添え字に使うケースで error C2677: 二項演算子 '[': 型 'Foo' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。 というコンパイルエラーになります……orz Visual Studio 2019なのですがおれ環?
225 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 23:45:44.60 ID:MlF8tgQAd.net] enum class Fooって書いてみやがれ
226 名前:デフォルトの名無しさん mailto:sage [2022/11/23(水) 23:54:39.59 ID:g5bfG+kA0.net] >>217 配列インデックスに利用できない https://monozukuri-c.com/langcpp-funclist-enum-class/
227 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 00:25:30.42 ID:WosJnlmu0.net] レス㌧クス なるほどキャスト必須ですか、、、 Fooへの整数の代入だけエラーになるのかと思ったら 思ってたのと違う……
228 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 01:18:48.76 ID:4/0XLjMc0.net] スコープを限定したいときは以下のように俺は書いてるな namespace Foo { enum { A, B, C, D, N }; } int main () { struct Bar { enum { A, B, C, D, N }; }; int arr0[Foo::N]; arr0[Foo::A] = 1; int arr1[Bar::N]; arr1[Bar::A] = 1; return 0; }
229 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 01:41:40.71 ID:4/0XLjMc0.net] >>221 は忘れてくれ 寝ぼけてた
230 名前:はちみつ餃子 mailto:sage [2022/11/24(木) 02:01:14.76 ID:7DmT43os0.net] >>217 enum class といいつつ enum で宣言しているところをみるに、 ひょっとして enum と enum class が別物であることを知らずに混乱しているのでは? ちなみに enum class も class というキーワードを使いはするが分類上はクラスではないのも混乱するかもな。 > enum classはint以外の整数型としても たぶん underlying type のことを言っているんだと思うが 指定しなかったときの underlying type は int ではなく その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。 (格納可能である限りは int より大きくなることはないという制約はついているけど。)
231 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 06:18:15.26 ID:0c/PVttN0.net] >>223 > 指定しなかったときの underlying type は int ではなく > その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。 > (格納可能である限りは int より大きくなることはないという制約はついているけど。) それunscoped enumeration typeの方 enum class は無指定だと int になる https://cpprefjp.github.io/lang/cpp11/scoped_enum.html
232 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 08:03:44.62 ID:WosJnlmu0.net] >>223 >>217 でenum Fooと書いたのはenum class Fooの誤記でしたサーセン;;;; enum classを自動では整数型に変換してくれないのはやっぱおれ環?
233 名前:デフォルトの名無しさん [2022/11/24(木) 08:35:12.79 ID:0WkgaUasa.net] >>225 おれ環ではなくて仕様
234 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 08:57:54.29 ID:rMCXw8Tu0.net] C++の言語仕様を決めてる人たちの考えとしては 配列とハッシュはまったく異なる概念なので分けて使うようにってことですか?
235 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 09:08:45.63 ID:AuoRjAvpd.net] 逆に聞きたいが 配列とハッシュが同じカテゴリに入ることなんてあるのか?
236 名前:デフォルトの名無しさん [2022/11/24(木) 09:20:49.08 ID:qRYWlPaYd.net] enumはいらないこ
237 名前:はちみつ餃子 mailto:sage [2022/11/24(木) 11:00:48.22 ID:7DmT43os0.net] 歴史的経緯というやつだなぁ。 C では列挙子の型が int なんだよ。 列挙型は定義ごとに独立した型になるのに列挙子は整数そのものとして扱われる。 C++ では列挙子の型は列挙型に変更しつつも型変換がゆるゆるだから結果的に C とほぼ同じ挙動になって互換性が維持された。 あまりよくはないが C との連携は C++ の強みだから仕方がない。 でもさすがに扱いにくいから新しく enum class が作られたという経緯なので最初から使い分けを意図して二種類作られたわけではない。 enum の改良として enum class が出来たので一貫性がなく全く別物として成立している。
238 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 12:09:29.22 ID:rMCXw8Tu0.net] >>228 PerlのハッシュはC++ではmapやsetっていうんだね ただ今勉強中で頓珍漢なこと言ってしまった、すいません
239 名前:デフォルトの名無しさん (テテンテンテン MM8e-IwB9) mailto:sage [2022/11/24(木) 12:23:01.01 ID:hRuvaNsTM.net] >>231 mapは写像、setは集合が大本の概念だからな。 Hashはハッシュ関数という写像の一種だから、正確には同じじゃない。
240 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 12:57:58.38 ID:ggwtZAtna.net] dictがいいね
241 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 14:33:18.54 ID:CXfVk4LxH.net] ハッシュを使ってマップ(対応付)ってことよね
242 名前:デフォルトの名無しさん mailto:sage [2022/11/24(木) 15:31:29.44 ID:a85Uy2KJM.net] 簡単そうに見えたけど、俺の中でなかなか理解できないのが explicit 指定。 明示的初期化、直接初期化、代入初期化(?)、暗黙の型変換の禁止、 などなど色々な概念があるし、頭の中で整理できてない。 「直接初期化」の定義が今一分かって無い。
243 名前:はちみつ餃子 mailto:sage [2022/11/25(金) 09:44:10.24 ID:9Oo+WeOy0.net] >>235 もちろん色々な概念と相互に関係はあるんだが explicit 指定に直接的に関連するルールは ・ 引数一個で呼び出せるコンストラクタ (デフォルト引数や可変長引数の場合も含む) は変換コンストラクタ (converting constructor) としても機能する ・ ただし explicit 指定がついている場合はそうならない ってだけだな。 変換コンストラクタがいつ起動するのかはまた別の話として……。
244 名前:デフォルトの名無しさん mailto:sage [2022/11/25(金) 11:20:20.74 ID:rtODN+wBd.net] C++03まではそうだったけど 11から複数引数にも波括弧からの変換を認めない機能が追加されてややこしくなってる struct Hoge{ /*explicit*/ Hoge(int,double,char*); … }; Hoge foo(){ return {42,3.14,”Hello”); // explicitだとダメ } Hoge h[] = { {1,1.0,””}, {2,2.0,””}}; //explicitだとダメ
245 名前:デフォルトの名無しさん [2022/11/25(金) 12:30:00.19 ID:PV2ZG9bua.net] ハッシュを使って実現した連想配列をハッシュって呼ぶのは 携帯電話をケータイと呼ぶような類のこと
246 名前:デフォルトの名無しさん mailto:sage [2022/11/25(金) 12:43:43.65 ID:hG6NI52YM.net] >>238 誤用の無い範囲で用語を混同するのは理工学じゃ普通。
247 名前:デフォルトの名無しさん [2022/11/25(金) 12:47:02.94 ID:PV2ZG9bua.net] >>237 こういうこと? #include <iostream> using namespace std; struct Hoge{ int a; double b; char *c; explicit Hoge(int _a, double _b, char *_c) : a(_a), b(_b), c(_c) {} }; Hoge foo(){ return Hoge{42, 3.14, "Hello"}; } Hoge h[] = {Hoge{1, 1.0, ""}, Hoge{2, 2.0, ""}
248 名前:}; int main() { return 0; } [] [ここ壊れてます]
249 名前:デフォルトの名無しさん mailto:sage [2022/11/25(金) 12:48:02.39 ID:PV2ZG9bua.net] >>237 >>240 なら通るって意味ね https://ideone.com/zBKL6Z
250 名前:はちみつ餃子 mailto:sage [2022/11/25(金) 12:50:26.80 ID:9Oo+WeOy0.net] そのへんの仕様を何度も読んだことは記憶にあるのに内容はなんも覚えとらん。 実際わかりにくいと思うわ。
251 名前:デフォルトの名無しさん mailto:sage [2022/11/25(金) 14:21:14.78 ID:TzWxad5dM.net] 今まで本を読んでも、「直接初期化」「コピー初期化」 の厳密定義が分からなかったけど、英語版の en.cppreference.com をそれぞれ 「direct initialization」「copy initialization」 で検索すると「全てのパターン(?)」の一覧が出てくるみたいだ。
252 名前:デフォルトの名無しさん mailto:sage [2022/11/25(金) 14:30:36.00 ID:rtODN+wBd.net] >>241 それはただのHogeのコピー 波括弧からの暗黙変換を禁止するのがexplicit