- 1 名前:sage [2025/04/26(土) 10:34:58.41 ID:pbPDl6lv0.net]
- !extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512 ↑同じ内容を3行貼り付けること 次スレは>>980が立てること 無理なら細かく安価指定 ※前スレ C++相談室 part165 https://mevius.5ch.net/test/read.cgi/tech/1698705458/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 564 名前:デフォルトの名無しさん mailto:sage [2025/07/14(月) 20:03:36.26 ID:CQ+aGKeG0.net]
- test
- 565 名前:デフォルトの名無しさん mailto:sage [2025/07/14(月) 20:04:22.78 ID:CQ+aGKeG0.net]
- >>563
ありがとう。Sleep(0)が何をやっているかはわかっている
- 566 名前:デフォルトの名無しさん mailto:sage [2025/07/14(月) 20:05:51.19 ID:CQ+aGKeG0.net]
- >>561のwhile中を空にする(Sleep(0)しない) > while中でSleep(0)する > while中でSleep(1)する(時間単位を1msにして待ち時間を1ms縮める)
という具合にCPU占有率が上がる。精度は落ちるがSleep(1)を入れた方がCPUの負荷は減るので、何となく安心する。
- 567 名前:デフォルトの名無しさん mailto:sage [2025/07/14(月) 20:06:23.37 ID:CQ+aGKeG0.net]
- >>561のwhileの中でSleep(0)しつつ準ビジー状態を強行するのがどれだけハードに悪影響なのか、その辺りの実績経験を盗みかった。卑しい盗人を助けてくれ下さい
- 568 名前:デフォルトの名無しさん mailto:sage [2025/07/15(火) 00:13:36.01 ID:KEPxDdxR0.net]
- C++スレ的にはthis_thread::yieldかと思ったんだが
- 569 名前:デフォルトの名無しさん mailto:sage [2025/07/15(火) 04:24:49.25 ID:4J45BJq00.net]
- >>561
グラフィックのAPIは何使ってる? 何と比べて安定したのかしらんけどそのやり方でディスプレイの出力と同期できるわけないのわかる?
- 570 名前:デフォルトの名無しさん mailto:sage [2025/08/04(月) 06:40:16.41 ID:0gfRmGh70.net]
- ちょっ質問なのですが
unsigned long m_ulAbortReasonBmp; std::mutex m_mutex; std::atomic<unsigned long> m_ulBias; に対し、 m_mutex.lock(); m_ulAbortReasonBmp |= fooBmp; // (1) : m_mutex.lock()期間内 m_mutex.unlock(); m_ulBias.store(barVal, std::memory_order_release); // (2) : m_mutex.lock()期間外だがm_mutex.lock()期間の後 としたとき、 Q1. m_mutex.lock()している他スレッドから見て(1)、(2)の操作の順序(m_ulAbortReasonBmpが変化した後、m_ulBiasが変化する)は保証される? Q2. m_mutex.lock()していない他スレッドから見てんも(1)、(2)の操作の順序(m_ulAbortReasonBmpが変化した後、m_ulBiasが変化する)は保証される?
- 571 名前:デフォルトの名無しさん mailto:sage [2025/08/04(月) 07:34:20.02 ID:0gfRmGh70.net]
- Q1については、他スレッドから見てm_ulBiasのreadが
m_mutex.lock()期間(クリティカルセクション)内のm_ulAbortReasonBmpへの書き込みより 先行するようなことが起きるとクリティカルセクションの意味が消失するから保証される Q2についてはm_ulBiasのreadがプロセッサコアにどう計画されるかわからないから m_ulAbortReasonBmpへの書き込みの後になることは一般に保証されない、 が、現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで いかなるreadもwriteも無差別にバリアする)により、lockしないスレッドから見ても順序が実質的に保証される、 でおk?
- 572 名前:デフォルトの名無しさん mailto:sage [2025/08/04(月) 08:33:59.43 ID:0gfRmGh70.net]
- 訂正orz、
Q2のケースでは保証されない 現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで いかなるreadもwriteも無差別にバリアする)のが真実だとしても、 それはm_ulAbortReasonBmpやm_ulBiasをwriteする側のスレッドがwrite順を守るというだけで、 m_ulAbortReasonBmpやm_ulBiasをreadする側のスレッドにはメモリバリアするコードが無いから read順を好きに計画され、writeした順でreadされる保証が無い
- 573 名前:デフォルトの名無しさん mailto:sage [2025/08/04(月) 08:41:31.47 ID:3rv0HXUI0.net]
- >ちょっ
かわいい …舐めてんの?
- 574 名前:デフォルトの名無しさん mailto:sage [2025/08/04(月) 16:26:39.26 ID:Tt4A7oMm0.net]
- >>572
コードに無いreadの話が入ってくるのが意味がわからない 聞きたいことはwriteの順番が保証されるかではないのか? writeの順番は保証される
- 575 名前:デフォルトの名無しさん [2025/08/10(日) 21:35:26.79 ID:gXfPFnW/0.net]
- 男きたああああああああああ
- 576 名前:デフォルトの名無しさん [2025/08/22(金) 07:16:07.15 ID:iDw/vpGA0.net]
- 初心者だけど、
Pythonみたいにreturnを複数ってできないの? touple使うくらい?
- 577 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 07:35:30.89 ID:8V9ySHS/0.net]
- 複数の値を一つにまとめればいいだけ
返す型次第
- 578 名前:デフォルトの名無しさん [2025/08/22(金) 08:55:40.38 ID:LQncxxKI0.net]
- 複数返したいならタプルでいいんじゃない
引数に出力渡すのが多いと思うけど
- 579 名前:はちみつ餃子 mailto:sage [2025/08/22(金) 10:34:20.59 ID:s1oN92u00.net]
- Python でも返却値として複数の値を返すことは出来ない。
Python で return にカンマ区切りで複数の式を書くとタプルになってる。 受け取る側で複数の変数を書いておけばタプルが分配 (unpack) されたりはするけど…… 関数が返却しているのはあくまでもひとつの値という理屈。 複数の値 (いわゆる多値) を関数が返せる言語はそれほど多くない。 LISP 系は多値のサポートがあることが多いけどそれ以外だと Go くらいじゃないかな? (マイナー言語だとわからんけどよく知られている主要な言語にはほとんどないと思う。) シンタクス的には C++ で return にカンマ区切りで複数の値を渡そうとしたとき、 つまり return 1, 2, 3; というように書いたときのカンマはカンマ演算子として解釈される。 カンマ演算子は左辺の結果を捨てる (評価はする) ので 3 だけが返却値になる。 C++ で複数の値をひとまとめにするには波括弧で囲む記法があって std::tuple<int, int, int> foo(void) { return {1, 2, 3}; } というように書けるんだが…… この波括弧は初期化の記法であってタプルのリテラルというわけではないのでそこんところは注意。
- 580 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 10:49:05.94 ID:hiXhYkKD0.net]
- >>579
受け取る方はどうやって受ければいいのですか? 私の頭だと構造体で返せばいいかな なんつて
- 581 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 11:06:34.54 ID:HM+/3rtsM.net]
- >>580
構造化束縛で取り出すのが楽 構造体を定義する手間が気にならないならそれでもいい
- 582 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 11:49:05.11 ID:ZeYv0pFNd.net]
- C++も昔に比べれば随分と楽になった
- 583 名前:はちみつ餃子 mailto:sage [2025/08/22(金) 12:07:46.82 ID:s1oN92u00.net]
- >>580
タプルは単にタプル型の値なので普通に受け取れる。 auto bar = foo(); といったように書ける。 タプルから要素を取り出すのは std::get<0>(bar); といった要領になる。 受け取るときに変数に分配するやり方もあって atuo [r1, r2, r3] = foo(); というようにも書ける。 これを構造化束縛という。 おそらくこれが期待していたものなんじゃないか? この記法はタプルに限らずタプルライクな型、配列型、データメンバが全て公開直接メンバであるような型などであれば使える。
- 584 名前:はちみつ餃子 mailto:sage [2025/08/22(金) 12:23:44.06 ID:s1oN92u00.net]
- もし使っているコンパイラが MSVC なら MSVC のデフォルトでは C++14 になってるはずだからそのままだと構造化束縛を使えないかも。
(構造化束縛は C++17 から。) 私は MSVC を利用していないから具体的なやり方は知らんけど必要なら適当に設定してね。
- 585 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 17:49:52.20 ID:hiXhYkKD0.net]
- どもです。構造化束縛ね。なんか聞いた事あるかなという程度だった。
使うかなぁ・・・
- 586 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 21:41:35.66 ID:NcnZjMQ+0.net]
- 構造体ほど強いまとまりではなく、返り値だけのゆるいまとまりなら構造化束縛の方が便利だけどねぇ
- 587 名前:デフォルトの名無しさん [2025/08/22(金) 21:41:55.58 ID:iDw/vpGA0.net]
- >>579
std::tuple<int, float, long> foo(void) { return {1, 2.1, 99}; } atuo [r1, r2, r3] = foo(); って書いたら、 r1に1が、r2に2.1が入るの? まあそれでもいいかな PythonからC++に移植中で、ちょっと読みづらいと思ったので…
- 588 名前:デフォルトの名無しさん [2025/08/22(金) 21:45:40.16 ID:iDw/vpGA0.net]
- >>587
まあでも、なんで複数returnにしないのかね? outの引数が多すぎだわ
- 589 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 22:11:20.77 ID:NcnZjMQ+0.net]
- Python でも複数return ってできないと思うけど?
カンマ演算子でタプルを作って返してるだけでしょ
- 590 名前:デフォルトの名無しさん mailto:sage [2025/08/22(金) 23:03:10.61 ID:5NhjtIih0.net]
- そうやね。Pytnonのカンマは、言語仕様上は演算子とは一応区別されているみたいだけど、感覚的には演算子だよね。何で演算子ではないんだろうというのはちょっとした疑問だけど(1, みたいなのを後置演算子と呼ぶのはちょっと変とかそういうことかな?)
- 591 名前:デフォルトの名無しさん mailto:sage [2025/08/23(土) 01:30:59.35 ID:ynkOCuVA0.net]
- //こんな感じ?
#include <iostream> #include <tuple> using namespace std; tuple<int, float, long> foo() { return {1, 2.1, 99}; } int main(){ auto [r1, r2, r3] = foo(); cout<<r1<<endl; cout<<r2<<endl; cout<<r3<<endl; return 0; }
- 592 名前:デフォルトの名無しさん mailto:sage [2025/08/23(土) 01:57:32.43 ID:HIKpDy1T0.net]
- 構造化束縛を調べてみたら
fooの返り値はtupleでなくてもpairで返しても良さそうなんだけど どういうルールなの? キモい
- 593 名前:はちみつ餃子 mailto:sage [2025/08/23(土) 02:11:02.56 ID:CHT0FIec0.net]
- >>592
それがタプルライクの概念。 std::tuple_size の特殊化など、いくつかのインターフェイスを実装すればタプルと同じように扱ってくれる仕組み。 それとは別に配列の場合とか、全てのデータメンバが公開直接メンバなクラスもありということになってるのは単純に箇条書きで数種類のパターンを示す形になってる。 それほどパターンが多くはないがひとつの原則で表せるわけでもない。
- 594 名前:デフォルトの名無しさん mailto:sage [2025/08/23(土) 02:22:04.99 ID:HIKpDy1T0.net]
- >>593
>それほどパターンが多くはないがひとつの原則で表せるわけでもない。 キメぇよw
- 595 名前:デフォルトの名無しさん mailto:sage [2025/08/23(土) 09:17:36.36 ID:rBYkDYvT0.net]
- 構造的部分型とか静的ダックタイピングって呼ばれるやつ?
- 596 名前:デフォルトの名無しさん [2025/08/23(土) 13:12:32.34 ID:wVRYzYK20.net]
- >>591
int r1; float r2; long r3 r1, r2, r3 = foo(); って書きたいですね。Pythonみたく
- 597 名前:はちみつ餃子 mailto:sage [2025/08/23(土) 13:15:39.41 ID:DefMPT1k0.net]
- 代入のときは tie を使う。
- 598 名前:デフォルトの名無しさん [2025/08/23(土) 15:01:16.09 ID:p3yrvAiP0.net]
- テンプレートの黒魔術で脳汁出てからが本番
- 599 名前:デフォルトの名無しさん mailto:sage [2025/08/23(土) 15:37:03.06 ID:T+HzfXMC0.net]
- >>596
別の言語っぽくって考えは捨てた方が身のため
- 600 名前:デフォルトの名無しさん mailto:sage [2025/08/23(土) 19:08:06.22 ID:VwZegIlc0.net]
- 666!
- 601 名前:デフォルトの名無しさん [2025/08/23(土) 19:56:19.30 ID:k0uySdFmd.net]
- struct {
int r1, float r2, long r3 } t; t = foo(); って描きたい struct に tuple からのコンストラクタを実装すれば良いのかな
- 602 名前:はちみつ餃子 mailto:sage [2025/08/23(土) 20:18:30.70 ID:CHT0FIec0.net]
- >>601
最初から foo がその型で返せばいいんでないの?
- 603 名前:デフォルトの名無しさん mailto:sage [2025/08/24(日) 12:07:46.50 ID:HqphwiLf0.net]
- C言語から続くカンマ演算子が分かってないんでは?
- 604 名前:デフォルトの名無しさん mailto:sage [2025/08/24(日) 12:09:48.21 ID:gU3L8vdd0.net]
- Pythonあがりだから型を定義する意味がわかってないんだと思う
- 605 名前:デフォルトの名無しさん mailto:sage [2025/08/25(月) 07:55:54.04 ID:O202BBJ90.net]
- a=10
a=’hello' 翻訳しながらだからできるんだろうけどね。
- 606 名前:デフォルトの名無しさん mailto:sage [2025/08/25(月) 08:19:19.75 ID:X23BjBGY0.net]
- >590
左辺にも現れるからじゃね?
- 607 名前:初心者プログラマー [2025/08/28(木) 17:50:07.17 ID:GULY1B8W0.net]
- cppでbazelでmediapipeのビルド方法を教えてくれる方はいませんか?
自分の環境 Visual Studio Community 2022 Windows11 64 ビット scoopでbazel 5.3.0 Python 3.10.0
- 608 名前:青木康善 mailto:sage [2025/09/07(日) 03:16:03.97 ID:Fgms30k2a.net]
- なんか、javaより簡単に思えてきました。
- 609 名前:はちみつ餃子 mailto:sage [2025/09/07(日) 06:54:14.37 ID:Ur1gsBeL0.net]
- そうか。
- 610 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 07:39:38.11 ID:yhbLpr+z0.net]
- obj1=obj2;
の後obj2を変更すると、obj1が書き換わってまってびっくりして その後、Javaが怖い親父です。
- 611 名前:デフォルトの名無しさん [2025/09/07(日) 13:56:14.79 ID:ZFShxqYO0.net]
- C/C++もポインタを代入するとそうなるよ
- 612 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 15:17:34.87 ID:DiKqvn8B0.net]
- この親父他の言語ほぼ使えんだろ
- 613 名前:デフォルトの名無しさん [2025/09/07(日) 15:34:33.99 ID:AK/wIzqla.net]
- 普通 https://ideone.com/wGzMHW
p=[3,1,2] q=p p[1]=0 print(q)
- 614 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 16:53:15.89 ID:2DaEs5aKM.net]
- >>610 >>613
それはオブジェクトへの参照の競合が起きてる それぞれで書き換え更新または読み取り中の書き換えをすることでスパゲッティなコードを招いてしまう その競合をコンパイルエラーにして防いでくれるのはRustだけだと思う
- 615 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 17:20:59.28 ID:yhbLpr+z0.net]
- >>614
c/c++なら、ポインタなのか参照なのか見ればわかるし、 まずコンパイラが型をチェックしますんで。はい
- 616 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 17:34:06.57 ID:5bTmv8Qp0.net]
- 参照メインの言語で書き換えを頻繁に行うとそりゃ事故るよ、注意力にも限界がある
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし 参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
- 617 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 18:17:46.03 ID:kASsF2K3r.net]
- ないしは、q=p; ってしたときに、pがダメになってくれるか
- 618 名前:デフォルトの名無しさん mailto:sage [2025/09/07(日) 22:03:02.60 ID:2DaEs5aKM.net]
- >>615
C++では参照の競合があってもエラーとならず安全性は保証されないよ 例えば以下の挙動 std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7}; int& fifth = v[5]; v.push_back(100); std::vector<int> w{8, 8, 8, 8, 8, 8, 8, 8}; fifth = 555; std::cout << "v[5] = " << v[5] << std::endl; std::cout << "w[5] = " << w[5] << std::endl;
- 619 名前:デフォルトの名無しさん mailto:sage [2025/09/08(月) 07:59:15.17 ID:It1Ffdlu0.net]
- >>618
これわ別問題じゃないのですか。 にしても、おとろしい push_backされた時点で再構築されて、新規作成のオブジェクトの要素を保持してしまったで合ってますか?
- 620 名前:はちみつ餃子 mailto:sage [2025/09/08(月) 10:27:54.64 ID:bx3qX9/R0.net]
- 状況を一から説明すると……
これは fifth が古い無効になった場所を参照する可能性があることが問題。 std::vector の各要素は連続した空間に配置されることが保証されている。 要素の増減でその場所の都合が悪くなれば再配置される可能性があり、 再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。 無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。 再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、 キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。 そんでもってこれのややこしいところは「可能性がある」ってところで、 キャパシティをどれくらい拡大するか実装によって差があるし、 状況によっては場所を移動せずに大きさを伸ばせるかもしれない。 つまり問題が顕在化しないかもしれない。 一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして 顕在化しやすいようにしたんだろう。
- 621 名前:デフォルトの名無しさん mailto:sage [2025/09/08(月) 10:47:28.92 ID:It1Ffdlu0.net]
- >>620
どもです。要素数8ってのもさすがって感じでした。
- 622 名前:デフォルトの名無しさん mailto:sage [2025/09/08(月) 22:24:25.56 ID:EA0JjXQaM.net]
- >>620
今回の問題に限ればその通り ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと 今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる 既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた 参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する 両方の参照が書き換えを伴わないreadonlyの時のみ安全になる 片方もしくは両方の参照が書き換えを伴うと安全でなくなる
- 623 名前:デフォルトの名無しさん mailto:sage [2025/09/08(月) 23:06:53.70 ID:HoahUzIM0.net]
- 再配置が行われるものに参照使って、その生存期間を超えてアクセスするのは未定義動作になるわな。C++に慣れてればそんなコードは書かないが、初級者向けではない。readonly より、lifetime の問題でしょう
- 624 名前:デフォルトの名無しさん mailto:sage [2025/09/09(火) 00:29:11.16 ID:TMUamLpP0.net]
- 参照が無効になる条件は規定されてるし、先にcapacity設定するとか避ける方法も用意されてる
「問題の本質」とやらはただのライブラリ仕様の無理解だろ 分かりにくいとか間違えやすいとかの批判なら分かるけど
- 625 名前:デフォルトの名無しさん mailto:sage [2025/09/09(火) 07:24:41.95 ID:DVL1/TmTM.net]
- >>623 >>624
申し訳ないがcapacityや再配置の話はしていない lifetimeや参照が無効になる話もしていない まずそれらを頭の中から消し去って考えよう 元々の話である同一データに対して参照が二つ持った時の話のみをしている もちろんvectorは登場してもしなくてもいい
- 626 名前:デフォルトの名無しさん mailto:sage [2025/09/09(火) 07:29:27.85 ID:DVL1/TmTM.net]
- 元々の話とは>>610や>>613でこれらが参照の競合の最も単純な例
様々な言語で発生してもちろんC++でも生じる 同一データに対して複数の参照を持つと他の参照によっていつの間にか指していたデータの値が書き換わってしまう これがバグやコードのスパゲッティ化を引き起こす最も大きな原因の一つ そのためreadonlyでない限り複数の参照を避けるのが好ましい そのため競合する参照を禁止している言語もある
- 627 名前:デフォルトの名無しさん [2025/09/09(火) 10:47:02.21 ID:g327vfuJd.net]
- readonlyでない競合する参照を禁止している言語もある
- 628 名前:デフォルトの名無しさん mailto:sage [2025/09/09(火) 12:16:08.28 ID:iPWQv8Oa0.net]
- はいはい線型論理言いたいだけ
- 629 名前:デフォルトの名無しさん mailto:sage [2025/09/10(水) 00:51:51.50 ID:BnR46AnOa.net]
- >>618
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
- 630 名前:デフォルトの名無しさん mailto:sage [2025/09/10(水) 02:12:52.51 ID:IF/zSGeMd.net]
- そうだよ。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
- 631 名前:629 mailto:sage [2025/09/10(水) 10:07:49.21 ID:3vsmg39oa.net]
- >>630
どうもありがとう
- 632 名前:デフォルトの名無しさん [2025/09/10(水) 10:13:08.62 ID:zTYInGVv0.net]
- >再構築されて新規の要素を保持してしまったで合ってますか
こう聴かれると「違う」と返事したくなる
- 633 名前:デフォルトの名無しさん mailto:sage [2025/09/10(水) 18:40:20.64 ID:Vv9EwJFH0.net]
- 未定義動作だからな
たまたま鼻から悪魔が出る代わりにそうなっただけだ
- 634 名前:デフォルトの名無しさん mailto:sage [2025/09/10(水) 22:18:27.54 ID:RAO/BxQt0.net]
- 参照の競合という用語に違和感。並行性に関わる競合状態 (race condition) の話をしようとしているのか?
- 635 名前:デフォルトの名無しさん mailto:sage [2025/09/10(水) 22:31:03.50 ID:BZTqerG60.net]
- してない
- 636 名前:デフォルトの名無しさん mailto:sage [2025/09/22(月) 23:24:45.15 ID:ZT49UQS30.net]
- でわ 簡単?な話題を。
int data{}; ってやります? int data{0}; ってやります?
- 637 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 06:55:15.77 ID:S9rfzcfC0.net]
- int data = 0; ってやる
- 638 名前:はちみつ餃子 mailto:sage [2025/09/23(火) 10:47:53.44 ID:0b1Ncss10.net]
- auto data = 0;
とか、型が明示的なのが好みなら auto data = int(); といった選択肢もある。 私は int data = 0; 派だけど。
- 639 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 10:57:08.68 ID:NP1ck5iL0.net]
- >>638
autoを使う理由は?
- 640 名前:はちみつ餃子 mailto:sage [2025/09/23(火) 11:12:21.28 ID:0b1Ncss10.net]
- >>639
暗黙的であれ明示的であれ初期化子に型があるのだからそれとは別にもう一度型を書くのは二度手間と言える場合がある。 どういう考え方をとるべきなのかは場合による。
- 641 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 11:17:00.61 ID:NP1ck5iL0.net]
- >>640
autoは曖昧だから、ゆるいプログラム用だね シビアなプログラムは無理
- 642 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 12:32:51.63 ID:zwbfimRS0.net]
- >>638
イテレータの返しを受けるオブジェクトはauto使うと便利みたいな
- 643 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 14:23:55.04 ID:SO+rqWsF0.net]
- >>641
テンプレート作るときには必須になる場合もある ゆるいって理解は雑
- 644 名前:はちみつ餃子 mailto:sage [2025/09/23(火) 14:48:06.92 ID:0b1Ncss10.net]
- 前提条件を変えると何でも言えてしまう。
とりあえずここでは発端は >>636 なのだから変数 data の型が int であり (多相にはしない) 内容はゼロで初期化するという狭い仮定を置いたほうがよかろう。 auto を持ち出したのは変に話題を曲げてしまったな。すまぬ。
- 645 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 20:34:08.12 ID:3YWvMRZsr.net]
- 今北
いまさら人に聞けない auto って、右辺の型もそのまま左辺にコピーしてきてよ、って感じで使ってるんだけど その認識で間違ってない? 落とし穴とかある?
- 646 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 20:39:56.49 ID:7uroOMzl0.net]
- 右辺が式の場合もあるし
その時自分が思ってた型とautoの型が一致するとは限らないところとか
- 647 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 21:26:37.10 ID:qWXNEai60.net]
- autoで手抜きしすぎるとあとでソース追うときにエライ苦労することあるから気を付けろよ
- 648 名前:デフォルトの名無しさん mailto:sage [2025/09/23(火) 21:34:42.79 ID:NP1ck5iL0.net]
- >>647
Pythonとか、 型が書かれてないから追いづらいよね
- 649 名前:はちみつ餃子 mailto:sage [2025/09/24(水) 02:24:38.07 ID:hHyw0Adk0.net]
- >>645
その認識でおおよそ正しいが変則的な部分もある。 auto foo = { 1, 2, 3 }; みたいに書くと initializer_list に推論されたりするのは知らないとちょっとびっくりするかもしれない。 それと修飾子などを組み合わせで使うことも出来る。 const auto* bar = &baz; みたいに。
- 650 名前:デフォルトの名無しさん mailto:sage [2025/09/24(水) 07:20:39.19 ID:tMR45KsJ0.net]
- >>649
何の目的であるの? C#的にゆるくなるだけだな…
- 651 名前:はちみつ餃子 mailto:sage [2025/09/24(水) 08:23:07.29 ID:yL+cLVSS0.net]
- >>650
ゆるいというのがどういう意味で言ってるのかわからないからなんとも言えない。 特に有用なのはテンプレート内で、たとえば template<class T> void foo(T x) { auto bar = baz(x); // baz は関数テンプレートだとする // ここでなんやかんや } みたいなのがあるとき auto を使わずに型を合わせて書こうとすると template<class T> void foo(T x) { decltype(baz(x)) bar = baz(x); // baz は関数テンプレートだとする // ここでなんやかんや } みたいになってわずらわしい。 初期化子の型をそのまま持ってくれば良いときに型を明示しても可読性に貢献しないし、簡便な記法があると楽。
- 652 名前:デフォルトの名無しさん [2025/09/24(水) 12:48:43.78 ID:4f1PT/5nH.net]
- std::make_sharedとか使うと行が長くなりがちだからauto便利
- 653 名前:デフォルトの名無しさん [2025/09/24(水) 23:18:51.30 ID:OQUpbPvH0.net]
- autoでしか出来ないこともあるから奥が深い
- 654 名前:デフォルトの名無しさん mailto:sage [2025/09/24(水) 23:47:45.55 ID:wXWMV3aG0.net]
- 罠仕様が仕込まれてるってだけでは
- 655 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 06:56:54.48 ID:iHrblX0Rr.net]
- Rust派に言わせれば、C++が罠らしいぞw
でもそのC++が、今の俺を生んだ
- 656 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 16:58:42.68 ID:tx4jrZ/E0.net]
- 有用なときもあるけど、ライブラリ用のコードで乱発するとメンテナンスが大変
可読性メンテナンス性を考えるなら、冗長でない限りはちゃんと書いた方がいい >>651 それもbaz(buz?)の戻り値の型はTから導出出来るんだから、よほどややこしくない限りはそれ(decltypeで手抜きせずに)を書いた方が可読性メンテナンス性の面では良い
- 657 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 17:00:57.66 ID:/3f9OB3n0.net]
- >>656
お前テンプレートプログラミングの素人さんだよね
- 658 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 20:40:29.81 ID:tx4jrZ/E0.net]
- >>657
自己紹介乙w Expression Template使って線形代数のライブラリ作った人間だが、ETで利用者がauto使うとどういう問題が起きるか答えてみ まさか分かりませんとか言わないよな? テンプレート使ったライブラリ(てか標準ライブラリ)を"利用する"しかしたことのない人間が調子に乗るな
- 659 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 20:43:04.50 ID:nRsNESWS0.net]
- なんか「その理論を作ったのは私ですが」みたいなものを感じる
技術発表の際の怖い質問とかなんとかのやつw
- 660 名前:デフォルトの名無しさん [2025/09/25(木) 20:43:46.25 ID:ofoI5OnU0.net]
- 言葉ならなんとでも言えるわな
- 661 名前:650 mailto:sage [2025/09/25(木) 20:44:29.25 ID:hN2fGih80.net]
- >>651
ふーん 便利だね でも、templete自体が何だか好きじゃないわ…
- 662 名前:650 mailto:sage [2025/09/25(木) 20:46:08.51 ID:hN2fGih80.net]
- >>656
ちゃんとっって、型を? 型が書いてないと、パット見でわからないよね…
- 663 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 20:54:22.86 ID:tx4jrZ/E0.net]
- >>662
そう&同感 ぱぱっと書いて何やってるかもすぐ分かるような場面(戻り値がイテレータとか)ではそりゃautoでいいと思うけどねぇ
- 664 名前:デフォルトの名無しさん mailto:sage [2025/09/25(木) 21:36:33.99 ID:SUv+BSiy0.net]
- 今ならconceptを使うのが筋が良いんだろうな
他の言語みたいに型制約を書かずにジェネリクスを使えるけど、これは良くも悪くもだよね 楽と言えば楽だけど
|

|