C++相談室 part166 (694レス)
1-

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
1: sage (ワッチョイ 8732-NXaD) 2025/04/26(土) 10:34:58.41 ID:pbPDl6lv0(1/2)調 AAS
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

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

※前スレ
C++相談室 part165
2chスレ:tech VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
568: (ワッチョイ 7001-jjSx) 2025/07/15(火) 00:13:36.01 ID:KEPxDdxR0(1)調 AAS
C++スレ的にはthis_thread::yieldかと思ったんだが
569: (ワッチョイ 6268-3HIJ) 2025/07/15(火) 04:24:49.25 ID:4J45BJq00(1)調 AAS
>>561
グラフィックのAPIは何使ってる?
何と比べて安定したのかしらんけどそのやり方でディスプレイの出力と同期できるわけないのわかる?
570: (ワッチョイ cda1-2ooF) 2025/08/04(月) 06:40:16.41 ID:0gfRmGh70(1/3)調 AAS
ちょっ質問なのですが
 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: (ワッチョイ cda1-2ooF) 2025/08/04(月) 07:34:20.02 ID:0gfRmGh70(2/3)調 AAS
Q1については、他スレッドから見てm_ulBiasのreadが
m_mutex.lock()期間(クリティカルセクション)内のm_ulAbortReasonBmpへの書き込みより
先行するようなことが起きるとクリティカルセクションの意味が消失するから保証される

Q2についてはm_ulBiasのreadがプロセッサコアにどう計画されるかわからないから
m_ulAbortReasonBmpへの書き込みの後になることは一般に保証されない、
が、現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで
いかなるreadもwriteも無差別にバリアする)により、lockしないスレッドから見ても順序が実質的に保証される、

でおk?
572
(1): (ワッチョイ cda1-2ooF) 2025/08/04(月) 08:33:59.43 ID:0gfRmGh70(3/3)調 AAS
訂正orz、
Q2のケースでは保証されない
現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで
いかなるreadもwriteも無差別にバリアする)のが真実だとしても、
それはm_ulAbortReasonBmpやm_ulBiasをwriteする側のスレッドがwrite順を守るというだけで、
m_ulAbortReasonBmpやm_ulBiasをreadする側のスレッドにはメモリバリアするコードが無いから
read順を好きに計画され、writeした順でreadされる保証が無い
573: (ワッチョイ 5f79-1HMX) 2025/08/04(月) 08:41:31.47 ID:3rv0HXUI0(1)調 AAS
>ちょっ
かわいい
…舐めてんの?
574: (ワッチョイ e3b9-Psuq) 2025/08/04(月) 16:26:39.26 ID:Tt4A7oMm0(1)調 AAS
>>572
コードに無いreadの話が入ってくるのが意味がわからない
聞きたいことはwriteの順番が保証されるかではないのか?
writeの順番は保証される
575: (ワッチョイ 7f4e-W9J6) 2025/08/10(日) 21:35:26.79 ID:gXfPFnW/0(1)調 AAS
男きたああああああああああ
576: (ワッチョイ d322-PSkW) 2025/08/22(金) 07:16:07.15 ID:iDw/vpGA0(1/3)調 AAS
初心者だけど、
Pythonみたいにreturnを複数ってできないの?
touple使うくらい?
577: (ワッチョイ 5bfd-Srv/) 2025/08/22(金) 07:35:30.89 ID:8V9ySHS/0(1)調 AAS
複数の値を一つにまとめればいいだけ
返す型次第
578: (ワッチョイ 5b85-ZBQJ) 2025/08/22(金) 08:55:40.38 ID:LQncxxKI0(1)調 AAS
複数返したいならタプルでいいんじゃない
引数に出力渡すのが多いと思うけど
579
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-86vp) 2025/08/22(金) 10:34:20.59 ID:s1oN92u00(1/3)調 AAS
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
(2): (ワッチョイ d1d6-uNzz) 2025/08/22(金) 10:49:05.94 ID:hiXhYkKD0(1/2)調 AAS
>>579
受け取る方はどうやって受ければいいのですか?

私の頭だと構造体で返せばいいかな なんつて
581: (ブーイモ MMb3-Srv/) 2025/08/22(金) 11:06:34.54 ID:HM+/3rtsM(1)調 AAS
>>580
構造化束縛で取り出すのが楽
構造体を定義する手間が気にならないならそれでもいい
582: (スププ Sdb3-im2P) 2025/08/22(金) 11:49:05.11 ID:ZeYv0pFNd(1)調 AAS
C++も昔に比べれば随分と楽になった
583: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-86vp) 2025/08/22(金) 12:07:46.82 ID:s1oN92u00(2/3)調 AAS
>>580
タプルは単にタプル型の値なので普通に受け取れる。

auto bar = foo();

といったように書ける。
タプルから要素を取り出すのは std::get<0>(bar); といった要領になる。
受け取るときに変数に分配するやり方もあって

atuo [r1, r2, r3] = foo();

というようにも書ける。
これを構造化束縛という。
おそらくこれが期待していたものなんじゃないか?

この記法はタプルに限らずタプルライクな型、配列型、データメンバが全て公開直接メンバであるような型などであれば使える。
584: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-86vp) 2025/08/22(金) 12:23:44.06 ID:s1oN92u00(3/3)調 AAS
もし使っているコンパイラが MSVC なら MSVC のデフォルトでは C++14 になってるはずだからそのままだと構造化束縛を使えないかも。
(構造化束縛は C++17 から。)
私は MSVC を利用していないから具体的なやり方は知らんけど必要なら適当に設定してね。
585: (ワッチョイ d1d6-uNzz) 2025/08/22(金) 17:49:52.20 ID:hiXhYkKD0(2/2)調 AAS
どもです。構造化束縛ね。なんか聞いた事あるかなという程度だった。
使うかなぁ・・・
586: (ワッチョイ c1ad-F95I) 2025/08/22(金) 21:41:35.66 ID:NcnZjMQ+0(1/2)調 AAS
構造体ほど強いまとまりではなく、返り値だけのゆるいまとまりなら構造化束縛の方が便利だけどねぇ
587
(1): (ワッチョイ d38d-PSkW) 2025/08/22(金) 21:41:55.58 ID:iDw/vpGA0(2/3)調 AAS
>>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: (ワッチョイ d38d-PSkW) 2025/08/22(金) 21:45:40.16 ID:iDw/vpGA0(3/3)調 AAS
>>587
まあでも、なんで複数returnにしないのかね?
outの引数が多すぎだわ
589: (ワッチョイ c1ad-F95I) 2025/08/22(金) 22:11:20.77 ID:NcnZjMQ+0(2/2)調 AAS
Python でも複数return ってできないと思うけど?
カンマ演算子でタプルを作って返してるだけでしょ
590
(1): (ワッチョイ 51a5-VfJp) 2025/08/22(金) 23:03:10.61 ID:5NhjtIih0(1)調 AAS
そうやね。Pytnonのカンマは、言語仕様上は演算子とは一応区別されているみたいだけど、感覚的には演算子だよね。何で演算子ではないんだろうというのはちょっとした疑問だけど(1, みたいなのを後置演算子と呼ぶのはちょっと変とかそういうことかな?)
591
(1): (ワッチョイ d1d6-uNzz) 2025/08/23(土) 01:30:59.35 ID:ynkOCuVA0(1)調 AAS
//こんな感じ?
#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
(1): (ワッチョイ 7101-Im4V) 2025/08/23(土) 01:57:32.43 ID:HIKpDy1T0(1/2)調 AAS
構造化束縛を調べてみたら
fooの返り値はtupleでなくてもpairで返しても良さそうなんだけど
どういうルールなの? キモい
593
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-oZZu) 2025/08/23(土) 02:11:02.56 ID:CHT0FIec0(1/2)調 AAS
>>592
それがタプルライクの概念。
std::tuple_size の特殊化など、いくつかのインターフェイスを実装すればタプルと同じように扱ってくれる仕組み。

それとは別に配列の場合とか、全てのデータメンバが公開直接メンバなクラスもありということになってるのは単純に箇条書きで数種類のパターンを示す形になってる。
それほどパターンが多くはないがひとつの原則で表せるわけでもない。
594: (ワッチョイ 7101-Im4V) 2025/08/23(土) 02:22:04.99 ID:HIKpDy1T0(2/2)調 AAS
>>593
>それほどパターンが多くはないがひとつの原則で表せるわけでもない。
キメぇよw
595: (ワッチョイ 2b10-fgJ7) 2025/08/23(土) 09:17:36.36 ID:rBYkDYvT0(1)調 AAS
構造的部分型とか静的ダックタイピングって呼ばれるやつ?
596
(1): (ワッチョイ d326-PSkW) 2025/08/23(土) 13:12:32.34 ID:wVRYzYK20(1)調 AAS
>>591
int r1;
float r2;
long r3

r1, r2, r3 = foo();

って書きたいですね。Pythonみたく
597: はちみつ餃子◆8X2XSCHEME (ワッチョイ 51e2-oZZu) 2025/08/23(土) 13:15:39.41 ID:DefMPT1k0(1)調 AAS
代入のときは tie を使う。
598: (ワッチョイ c9bc-zJwz) 2025/08/23(土) 15:01:16.09 ID:p3yrvAiP0(1)調 AAS
テンプレートの黒魔術で脳汁出てからが本番
599: (ワッチョイ 5be0-Srv/) 2025/08/23(土) 15:37:03.06 ID:T+HzfXMC0(1)調 AAS
>>596
別の言語っぽくって考えは捨てた方が身のため
600: (ワッチョイ 9379-XJDV) 2025/08/23(土) 19:08:06.22 ID:VwZegIlc0(1)調 AAS
666!
601
(1): (スフッ Sdb3-im2P) 2025/08/23(土) 19:56:19.30 ID:k0uySdFmd(1)調 AAS
struct {
int r1,
float r2,
long r3
} t;
t = foo();
って描きたい
struct に tuple からのコンストラクタを実装すれば良いのかな
602: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-86vp) 2025/08/23(土) 20:18:30.70 ID:CHT0FIec0(2/2)調 AAS
>>601
最初から foo がその型で返せばいいんでないの?
603: (ワッチョイ 6dad-W0Wb) 2025/08/24(日) 12:07:46.50 ID:HqphwiLf0(1)調 AAS
C言語から続くカンマ演算子が分かってないんでは?
604: (ワッチョイ fee0-ea+o) 2025/08/24(日) 12:09:48.21 ID:gU3L8vdd0(1)調 AAS
Pythonあがりだから型を定義する意味がわかってないんだと思う
605: (ワッチョイ 15d6-VoZ8) 2025/08/25(月) 07:55:54.04 ID:O202BBJ90(1)調 AAS
a=10
a=’hello'
翻訳しながらだからできるんだろうけどね。
606: (ワッチョイ 86cf-tcs3) 2025/08/25(月) 08:19:19.75 ID:X23BjBGY0(1)調 AAS
>590
左辺にも現れるからじゃね?
607: 初心者プログラマー (ワッチョイ d5ce-rKTE) 2025/08/28(木) 17:50:07.17 ID:GULY1B8W0(1)調 AAS
cppでbazelでmediapipeのビルド方法を教えてくれる方はいませんか?

自分の環境

Visual Studio Community 2022
Windows11  64 ビット
scoopでbazel 5.3.0
Python 3.10.0
608: 青木康善 (アウアウウー Sa47-Rd44) 2025/09/07(日) 03:16:03.97 ID:Fgms30k2a(1)調 AAS
なんか、javaより簡単に思えてきました。
609: はちみつ餃子◆8X2XSCHEME (ワッチョイ 1732-F+lb) 2025/09/07(日) 06:54:14.37 ID:Ur1gsBeL0(1)調 AAS
そうか。
610
(2): (ワッチョイ dbd6-ERpe) 2025/09/07(日) 07:39:38.11 ID:yhbLpr+z0(1/2)調 AAS
obj1=obj2;
の後obj2を変更すると、obj1が書き換わってまってびっくりして
その後、Javaが怖い親父です。
611: (ワッチョイ 7f5f-Z2G8) 2025/09/07(日) 13:56:14.79 ID:ZFShxqYO0(1)調 AAS
C/C++もポインタを代入するとそうなるよ
612: (ワッチョイ a380-1jR+) 2025/09/07(日) 15:17:34.87 ID:DiKqvn8B0(1)調 AAS
この親父他の言語ほぼ使えんだろ
613
(2): (アウアウウー Sa47-Y7lD) 2025/09/07(日) 15:34:33.99 ID:AK/wIzqla(1)調 AAS
普通 外部リンク:ideone.com
p=[3,1,2]
q=p
p[1]=0
print(q)
614
(1): (ワントンキン MMe6-+IOe) 2025/09/07(日) 16:53:15.89 ID:2DaEs5aKM(1/2)調 AAS
>>610 >>613
それはオブジェクトへの参照の競合が起きてる
それぞれで書き換え更新または読み取り中の書き換えをすることでスパゲッティなコードを招いてしまう
その競合をコンパイルエラーにして防いでくれるのはRustだけだと思う
615
(1): (ワッチョイ dbd6-ERpe) 2025/09/07(日) 17:20:59.28 ID:yhbLpr+z0(2/2)調 AAS
>>614
c/c++なら、ポインタなのか参照なのか見ればわかるし、
まずコンパイラが型をチェックしますんで。はい
616: (ワッチョイ 1ba6-aHNR) 2025/09/07(日) 17:34:06.57 ID:5bTmv8Qp0(1)調 AAS
参照メインの言語で書き換えを頻繁に行うとそりゃ事故るよ、注意力にも限界がある
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし
参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
617: (オッペケ Sr3b-wO3q) 2025/09/07(日) 18:17:46.03 ID:kASsF2K3r(1)調 AAS
ないしは、q=p; ってしたときに、pがダメになってくれるか
618
(2): (ワントンキン MMe6-+IOe) 2025/09/07(日) 22:03:02.60 ID:2DaEs5aKM(2/2)調 AAS
>>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: (ワッチョイ dbd6-ERpe) 2025/09/08(月) 07:59:15.17 ID:It1Ffdlu0(1/2)調 AAS
>>618
これわ別問題じゃないのですか。
にしても、おとろしい
push_backされた時点で再構築されて、新規作成のオブジェクトの要素を保持してしまったで合ってますか?
620
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 1732-F+lb) 2025/09/08(月) 10:27:54.64 ID:bx3qX9/R0(1)調 AAS
状況を一から説明すると……
これは fifth が古い無効になった場所を参照する可能性があることが問題。

std::vector の各要素は連続した空間に配置されることが保証されている。
要素の増減でその場所の都合が悪くなれば再配置される可能性があり、
再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。
無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。

再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、
キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。

そんでもってこれのややこしいところは「可能性がある」ってところで、
キャパシティをどれくらい拡大するか実装によって差があるし、
状況によっては場所を移動せずに大きさを伸ばせるかもしれない。
つまり問題が顕在化しないかもしれない。

一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして
顕在化しやすいようにしたんだろう。
621: (ワッチョイ dbd6-ERpe) 2025/09/08(月) 10:47:28.92 ID:It1Ffdlu0(2/2)調 AAS
>>620
どもです。要素数8ってのもさすがって感じでした。
622: (ワンミングク MM8a-+IOe) 2025/09/08(月) 22:24:25.56 ID:EA0JjXQaM(1)調 AAS
>>620
今回の問題に限ればその通り
ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと
今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる

既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた
参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある
これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する
両方の参照が書き換えを伴わないreadonlyの時のみ安全になる
片方もしくは両方の参照が書き換えを伴うと安全でなくなる
623
(1): (ワッチョイ e3ad-ckwE) 2025/09/08(月) 23:06:53.70 ID:HoahUzIM0(1)調 AAS
再配置が行われるものに参照使って、その生存期間を超えてアクセスするのは未定義動作になるわな。C++に慣れてればそんなコードは書かないが、初級者向けではない。readonly より、lifetime の問題でしょう
624
(1): (ワッチョイ 177c-h0AF) 2025/09/09(火) 00:29:11.16 ID:TMUamLpP0(1)調 AAS
参照が無効になる条件は規定されてるし、先にcapacity設定するとか避ける方法も用意されてる
「問題の本質」とやらはただのライブラリ仕様の無理解だろ
分かりにくいとか間違えやすいとかの批判なら分かるけど
625: (ワントンキン MM8a-+IOe) 2025/09/09(火) 07:24:41.95 ID:DVL1/TmTM(1/2)調 AAS
>>623 >>624
申し訳ないがcapacityや再配置の話はしていない
lifetimeや参照が無効になる話もしていない
まずそれらを頭の中から消し去って考えよう
元々の話である同一データに対して参照が二つ持った時の話のみをしている
もちろんvectorは登場してもしなくてもいい
626: (ワントンキン MM8a-+IOe) 2025/09/09(火) 07:29:27.85 ID:DVL1/TmTM(2/2)調 AAS
元々の話とは>>610>>613でこれらが参照の競合の最も単純な例
様々な言語で発生してもちろんC++でも生じる
同一データに対して複数の参照を持つと他の参照によっていつの間にか指していたデータの値が書き換わってしまう
これがバグやコードのスパゲッティ化を引き起こす最も大きな原因の一つ
そのためreadonlyでない限り複数の参照を避けるのが好ましい
そのため競合する参照を禁止している言語もある
627: (スフッ Sdba-bj1o) 2025/09/09(火) 10:47:02.21 ID:g327vfuJd(1)調 AAS
readonlyでない競合する参照を禁止している言語もある
628: (ワッチョイ 97e4-1jR+) 2025/09/09(火) 12:16:08.28 ID:iPWQv8Oa0(1)調 AAS
はいはい線型論理言いたいだけ
629: (アウアウウー Sa47-Rd44) 2025/09/10(水) 00:51:51.50 ID:BnR46AnOa(1)調 AAS
>>618
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
630
(1): (スッププ Sdba-j4tR) 2025/09/10(水) 02:12:52.51 ID:IF/zSGeMd(1)調 AAS
そうだよ。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
631: 629 (アウアウウー Sa47-Rd44) 2025/09/10(水) 10:07:49.21 ID:3vsmg39oa(1)調 AAS
>>630
どうもありがとう
632: (ワッチョイ 4e1f-bj1o) 2025/09/10(水) 10:13:08.62 ID:zTYInGVv0(1)調 AAS
>再構築されて新規の要素を保持してしまったで合ってますか
こう聴かれると「違う」と返事したくなる
633: (ワッチョイ 177c-h0AF) 2025/09/10(水) 18:40:20.64 ID:Vv9EwJFH0(1)調 AAS
未定義動作だからな
たまたま鼻から悪魔が出る代わりにそうなっただけだ
634: (ワッチョイ a75f-ckwE) 2025/09/10(水) 22:18:27.54 ID:RAO/BxQt0(1)調 AAS
参照の競合という用語に違和感。並行性に関わる競合状態 (race condition) の話をしようとしているのか?
635: (ワッチョイ b68c-1jR+) 2025/09/10(水) 22:31:03.50 ID:BZTqerG60(1)調 AAS
してない
636
(1): (ワッチョイ a3d6-X2Ee) 2025/09/22(月) 23:24:45.15 ID:ZT49UQS30(1)調 AAS
でわ 簡単?な話題を。
int data{}; ってやります? int data{0}; ってやります?
637: (ワッチョイ 7f7c-3pIy) 2025/09/23(火) 06:55:15.77 ID:S9rfzcfC0(1)調 AAS
int data = 0; ってやる
638
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-BMc3) 2025/09/23(火) 10:47:53.44 ID:0b1Ncss10(1/3)調 AAS
auto data = 0;
とか、型が明示的なのが好みなら
auto data = int();
といった選択肢もある。

私は
int data = 0;
派だけど。
639
(1): (ワッチョイ 8a02-CSnM) 2025/09/23(火) 10:57:08.68 ID:NP1ck5iL0(1/3)調 AAS
>>638

autoを使う理由は?
640
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-BMc3) 2025/09/23(火) 11:12:21.28 ID:0b1Ncss10(2/3)調 AAS
>>639
暗黙的であれ明示的であれ初期化子に型があるのだからそれとは別にもう一度型を書くのは二度手間と言える場合がある。
どういう考え方をとるべきなのかは場合による。
641
(1): (ワッチョイ 8a02-CSnM) 2025/09/23(火) 11:17:00.61 ID:NP1ck5iL0(2/3)調 AAS
>>640
autoは曖昧だから、ゆるいプログラム用だね
シビアなプログラムは無理
642: (ワッチョイ a3d6-X2Ee) 2025/09/23(火) 12:32:51.63 ID:zwbfimRS0(1)調 AAS
>>638
イテレータの返しを受けるオブジェクトはauto使うと便利みたいな
643: (ワッチョイ 46f6-RvFB) 2025/09/23(火) 14:23:55.04 ID:SO+rqWsF0(1)調 AAS
>>641
テンプレート作るときには必須になる場合もある
ゆるいって理解は雑
644: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-BMc3) 2025/09/23(火) 14:48:06.92 ID:0b1Ncss10(3/3)調 AAS
前提条件を変えると何でも言えてしまう。
とりあえずここでは発端は >>636 なのだから変数 data の型が int であり (多相にはしない) 内容はゼロで初期化するという狭い仮定を置いたほうがよかろう。
auto を持ち出したのは変に話題を曲げてしまったな。すまぬ。
645
(1): (オッペケ Sr23-RsoB) 2025/09/23(火) 20:34:08.12 ID:3YWvMRZsr(1)調 AAS
今北

いまさら人に聞けない
auto って、右辺の型もそのまま左辺にコピーしてきてよ、って感じで使ってるんだけど
その認識で間違ってない? 落とし穴とかある?
646: (ワッチョイ 467f-IpVF) 2025/09/23(火) 20:39:56.49 ID:7uroOMzl0(1)調 AAS
右辺が式の場合もあるし
その時自分が思ってた型とautoの型が一致するとは限らないところとか
647
(2): (ワッチョイ 73f0-ar7H) 2025/09/23(火) 21:26:37.10 ID:qWXNEai60(1)調 AAS
autoで手抜きしすぎるとあとでソース追うときにエライ苦労することあるから気を付けろよ
648
(1): (ワッチョイ 8a02-CSnM) 2025/09/23(火) 21:34:42.79 ID:NP1ck5iL0(3/3)調 AAS
>>647
Pythonとか、
型が書かれてないから追いづらいよね
649
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ e328-BMc3) 2025/09/24(水) 02:24:38.07 ID:hHyw0Adk0(1)調 AAS
>>645
その認識でおおよそ正しいが変則的な部分もある。
auto foo = { 1, 2, 3 };
みたいに書くと initializer_list に推論されたりするのは知らないとちょっとびっくりするかもしれない。

それと修飾子などを組み合わせで使うことも出来る。
const auto* bar = &baz;
みたいに。
650
(1): (ワッチョイ 8a02-CSnM) 2025/09/24(水) 07:20:39.19 ID:tMR45KsJ0(1)調 AAS
>>649
何の目的であるの?
C#的にゆるくなるだけだな…
651
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-VPhE) 2025/09/24(水) 08:23:07.29 ID:yL+cLVSS0(1)調 AAS
>>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: (JP 0Hc6-xemb) 2025/09/24(水) 12:48:43.78 ID:4f1PT/5nH(1)調 AAS
std::make_sharedとか使うと行が長くなりがちだからauto便利
653: (ワッチョイ 4a4e-rfem) 2025/09/24(水) 23:18:51.30 ID:OQUpbPvH0(1)調 AAS
autoでしか出来ないこともあるから奥が深い
654: (ワッチョイ e3a6-YvLc) 2025/09/24(水) 23:47:45.55 ID:wXWMV3aG0(1)調 AAS
罠仕様が仕込まれてるってだけでは
655: (オッペケ Sr23-RsoB) 2025/09/25(木) 06:56:54.48 ID:iHrblX0Rr(1)調 AAS
Rust派に言わせれば、C++が罠らしいぞw

でもそのC++が、今の俺を生んだ
656
(3): (ワッチョイ 0679-P6+q) 2025/09/25(木) 16:58:42.68 ID:tx4jrZ/E0(1/3)調 AAS
有用なときもあるけど、ライブラリ用のコードで乱発するとメンテナンスが大変
可読性メンテナンス性を考えるなら、冗長でない限りはちゃんと書いた方がいい

>>651
それもbaz(buz?)の戻り値の型はTから導出出来るんだから、よほどややこしくない限りはそれ(decltypeで手抜きせずに)を書いた方が可読性メンテナンス性の面では良い
657
(4): (ワッチョイ 4640-RvFB) 2025/09/25(木) 17:00:57.66 ID:/3f9OB3n0(1)調 AAS
>>656
お前テンプレートプログラミングの素人さんだよね
658
(5): (ワッチョイ 0679-P6+q) 2025/09/25(木) 20:40:29.81 ID:tx4jrZ/E0(2/3)調 AAS
>>657
自己紹介乙w
Expression Template使って線形代数のライブラリ作った人間だが、ETで利用者がauto使うとどういう問題が起きるか答えてみ
まさか分かりませんとか言わないよな?
テンプレート使ったライブラリ(てか標準ライブラリ)を"利用する"しかしたことのない人間が調子に乗るな
659: (ワッチョイ 3b82-IpVF) 2025/09/25(木) 20:43:04.50 ID:nRsNESWS0(1)調 AAS
なんか「その理論を作ったのは私ですが」みたいなものを感じる
技術発表の際の怖い質問とかなんとかのやつw
660: (ワッチョイ 4a4e-rfem) 2025/09/25(木) 20:43:46.25 ID:ofoI5OnU0(1)調 AAS
言葉ならなんとでも言えるわな
661: 650 (ワッチョイ 8a02-CSnM) 2025/09/25(木) 20:44:29.25 ID:hN2fGih80(1/2)調 AAS
>>651
ふーん
便利だね

でも、templete自体が何だか好きじゃないわ…
662
(1): 650 (ワッチョイ 8a02-CSnM) 2025/09/25(木) 20:46:08.51 ID:hN2fGih80(2/2)調 AAS
>>656
ちゃんとっって、型を?

型が書いてないと、パット見でわからないよね…
663: (ワッチョイ 0679-P6+q) 2025/09/25(木) 20:54:22.86 ID:tx4jrZ/E0(3/3)調 AAS
>>662
そう&同感
ぱぱっと書いて何やってるかもすぐ分かるような場面(戻り値がイテレータとか)ではそりゃautoでいいと思うけどねぇ
664: (ワッチョイ ff67-ZW/Z) 2025/09/25(木) 21:36:33.99 ID:SUv+BSiy0(1)調 AAS
今ならconceptを使うのが筋が良いんだろうな
他の言語みたいに型制約を書かずにジェネリクスを使えるけど、これは良くも悪くもだよね
楽と言えば楽だけど
665
(2): (ワッチョイ 7307-RsoB) 2025/09/26(金) 01:34:47.37 ID:aJA0eUoF0(1/2)調 AAS
>>658
リポジトリ晒して

まさか出せませんとか言わないよな?
テンプレート使ったライブラリ(てか標準ライブラリ)を"内製する"しかしたことのない人間が調子に乗るな
666
(1): (ブーイモ MMbb-RvFB) 2025/09/26(金) 01:53:11.78 ID:IAhZoqBcM(1)調 AAS
>>658
端的に言って

> それもbaz(buz?)の戻り値の型はTから導出出来るんだから、

ここだよ
関数テンプレートなんだから型が導出できるとは限らない
なぜお前は断言したのかな?
導出できない例にぶち当たったことがないからだよな
667: (ワッチョイ 0679-P6+q) 2025/09/26(金) 07:26:52.27 ID:uQKo8FSG0(1/7)調 AAS
>>665 >>668
煽ればタダで教えてもらえると思ってるいつものアホか

>導出できない例
あるわけないだろどうやって実体化するんだよwwwwww
668
(1): (ワッチョイ 8e02-C7mS) 2025/09/26(金) 08:15:01.31 ID:FGFv/5hn0(1)調 AAS
conceptはテンプレートだけじゃなく普通の変数制約にも使えればなぁ。
継承がほとんどいらなくなる。
669: (アウアウウー Sacf-kv3/) 2025/09/26(金) 10:28:59.69 ID:UkFmEBgMa(1)調 AAS
>>647
判ります
670: (ワッチョイ 5301-QugL) 2025/09/26(金) 11:12:51.14 ID:TfDLIQWg0(1)調 AAS
手抜きというか情報を重複させないためにはautoが必要
苦労するのは型情報を追えないツールが悪い
671: (ワッチョイ bff0-ar7H) 2025/09/26(金) 11:53:52.65 ID:IRzSnzQy0(1)調 AAS
>>648
ああ、おそろしいあの言語は
素人にはササッと組めて楽チンだろうけど大掛かりなものは無理だろうな
想像しただけで脳が震えて耳から溶けて出てきそうだ
672
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-VPhE) 2025/09/26(金) 12:02:33.14 ID:E9e6Z1Un0(1/4)調 AAS
expression template を auto で受けるとまずいってのは Eigen みたいな設計の話かな。
あれはムーブがない時代の設計だから一時オブジェクトの参照を保持してしまう (先に一時オブジェクトが解体されて寿命管理が破綻する) のが問題なのであって、解決のための仕組みが与えられたにもかかわらずそれを使ってない設計が悪い。
expression template の仕組み上でどうしても解決できないというわけではないし auto のせいでもない。

ムーブのコストすら許容できないだとか、古い C++ (C++03 以前) もサポートしなきゃならないみたいな事情があるなら「すまんけどこのライブラリを使うときは注意して」というべき筋合いの話で、「auto なんか使っとるからじゃ!」みたいな態度はおかしいだろ。
673: (ワッチョイ 0679-P6+q) 2025/09/26(金) 12:09:27.62 ID:uQKo8FSG0(2/7)調 AAS
>>672
>のが問題なのであって
違う。ETの場合、関数(演算子オーバーロード含む)が返すのは、式の構造を表すオブジェクトなのでそれをautoで受けると式の展開が行われず、計算処理の無いコードになってしまう
それを逆手に取ってauto経由で展開のタイミング遅らせることもできるけどね

あとETの利点はムーブどうこうで解決できる問題だけではないし、
誰も「ETを万人が使うべき」だなどと言っとらんよ、何が気に入らんかったの?

で、はちみつお前いつも「知ったかぶりしていい加減なことを言う奴」に怒ってる割に、自分も同じ事してるよな
674: (ワッチョイ 0679-P6+q) 2025/09/26(金) 12:11:01.51 ID:uQKo8FSG0(3/7)調 AAS
あと
>「auto なんか使っとるからじゃ!」
一言も言ってないんだが。流れ読み直しておいで
675
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-BMc3) 2025/09/26(金) 12:54:00.88 ID:E9e6Z1Un0(2/4)調 AAS
>>672
> autoで受けると式の展開が行われず、計算処理の無いコードになってしまう

書いてなかったが評価タイミングは適当な関数で明示的にする前提を置いてた。
未定義を踏むのは他の何と比べても駄目だ。単に思ってた結果と違ったなんてのは重要じゃない。

> 誰も「ETを万人が使うべき」だなどと言っとらんよ、何が気に入らんかったの?

日常的には使わないケースだからこそだ。
それが auto の問題点のように挙げられてただろ?
ライブラリのほうが C++ の自然な習慣に合わせるのが筋なのにさ。
676: (ササクッテロラ Sp23-P6+q) 2025/09/26(金) 13:15:19.27 ID:4po4sxfpp(1/6)調 AAS
>>657-658
677
(1): (ササクッテロラ Sp23-P6+q) 2025/09/26(金) 13:19:26.24 ID:4po4sxfpp(2/6)調 AAS
>>675
あと、ETで式の評価が発生するのは関数の呼び出し時ではない。どうでもいいけど
あと俺が作ったのは4次元まで(行列なら4x4まで。ゲーム用なので)だからヒープ使わんのでそもそもムーブどうこうは関係無いし、勝手によそのライブラリの未定義の話を持ってこられても困る
678: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-BMc3) 2025/09/26(金) 13:57:45.37 ID:E9e6Z1Un0(3/4)調 AAS
>>677
eigen は例として話題に出したつもりだったが余計だったな。
端的に主旨を言えば expression template の原理的には auto で受けれるように作ることは可能、かつその方が親切な作りだろうという話をしてる。

お前がどんな設計をしたのかなんてそれこそ俺には知ったことじゃないし、知りようもない。
お前のライブラリで auto で受けれないのはお前がそう設計しただけの話なので、 それを根拠に auto がどうこう言ってもなんの足しにもならん。
679
(1): (ササクッテロラ Sp23-P6+q) 2025/09/26(金) 14:04:20.28 ID:4po4sxfpp(3/6)調 AAS
>>657-658
ETの話はここで出した。

で、俺のautoの使い方に関する意見は>>656

自分が何をやってるか良く考えてからレス書き直せ
680
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f32-BMc3) 2025/09/26(金) 14:08:11.66 ID:E9e6Z1Un0(4/4)調 AAS
>>679
悪い設計のせいで利用者に不自然な書き方を強いるライブラリを作ったという話だということは理解してる。
681: (ササクッテロラ Sp23-P6+q) 2025/09/26(金) 14:13:42.65 ID:4po4sxfpp(4/6)調 AAS
あといちいち知ったかぶってるバカに教えてやるのも腹が立つが、普通数値演算でET使うときは代入演算子やコンストラクタに式を渡した場所で初めて式を展開するんだよ
(autoでわざと評価を遅延させることも可能だと書いただろアホ)
Eigenでも多分そう
もちろんboost::spiritとかの構文解析ならパース処理の関数に渡すまで展開しないだろうが
682: (ササクッテロラ Sp23-P6+q) 2025/09/26(金) 14:14:19.90 ID:4po4sxfpp(5/6)調 AAS
>>680
不自然なのはお前の、「スキルに見合わない自尊心」だと思うぞ
683: (ササクッテロラ Sp23-P6+q) 2025/09/26(金) 14:24:32.42 ID:4po4sxfpp(6/6)調 AAS
バカが屁理屈書いてきそうだから再三言うが、>>658>>657を叩くために出した問いに過ぎない
「意図しないコードになる」という話

これだからお前には絡みたくないんだよマジ鬱陶しい
684
(1): 2025/09/26(金) 17:03:47.95 ID:iKKvsVQ80(1)調 AAS
お前ってのははちみつのこと言ってるのかね?
自分から絡んどいて何言ってんだろうコイツとしか思えんけど
685
(1): (ワッチョイ 0679-P6+q) 2025/09/26(金) 17:53:41.26 ID:uQKo8FSG0(4/7)調 AAS
>>684
で、>>666の導出出来ない例って何?www
686: (ワッチョイ 467f-RvFB) 2025/09/26(金) 19:18:42.84 ID:+hZbpaFa0(1/2)調 AAS
>>685
ラムダの型導出できないだろ?
なんでこんなのも知らんのにえらそうにしてんの?
あと

外部リンク:wandbox.org

とかな
この例でfooでもif constexprを使えばautoはなくせるがそんなことやって可読性とかほざけない
他にもパターンあるぞ
謝罪してお前が作ったらしいヘボライブラリ公開したら教えてやってもいいぞ
687
(1): (ワッチョイ 0679-P6+q) 2025/09/26(金) 19:32:01.31 ID:uQKo8FSG0(5/7)調 AAS
屁理屈にも程がある
導出出来なきゃどうやって実体化するんだよ、Tしかテンプレートパラメータが無い状況でT以外に依存するものがあるのか?
まさか結果がTに依存するテンプレートになったら「導出出来てない」とかほざくの?
Tに依存するコンテナのイテレータと何も変わらんよそれ
688: (ワッチョイ 0679-P6+q) 2025/09/26(金) 20:12:50.41 ID:uQKo8FSG0(6/7)調 AAS
てかその例でauto使わずに戻り値格納するのにif constexpr使うしかないと思ってるとかどんだけ経験不足なんだ・・・(はっきり処理分けする必要がある場合を除く)
そんなクソみたいな例ならさすがにdecltypeかauto使いたくなるが(そもそも使うなと言ってないんだが)、conditionalも知らんのかお前は
必死に探してきてご苦労さん
689: (ワッチョイ 7307-RsoB) 2025/09/26(金) 20:41:40.17 ID:aJA0eUoF0(2/2)調 AAS
あの…そろそろ言っとくが

おもろいこと書いたヤツが優勝な?
2ちゃん5ちゃんの原則だぞ
690: (ワッチョイ 0679-P6+q) 2025/09/26(金) 20:46:36.85 ID:uQKo8FSG0(7/7)調 AAS
>>665はおもろいと自分で思ってんの?w
691: (ワッチョイ 467f-RvFB) 2025/09/26(金) 20:59:48.54 ID:+hZbpaFa0(2/2)調 AAS
>>687
おじいちゃん、ラムダの例で詰んでんのわかる?
わかんない?
わかんないかぁ
692: (ワッチョイ 8a02-CSnM) 2025/09/27(土) 00:06:32.90 ID:ov4hhnsF0(1)調 AAS
やっぱautoはゆるいね
C#とかPython的な感じ…
693: (ワッチョイ 7307-RsoB) 2025/09/27(土) 05:08:15.66 ID:rNLW6nkI0(1)調 AAS
C++は自由なんだよ

変な風にも使えるし、傍で見てたらめちゃくちゃにもなる
694: (ワッチョイ 1ed6-X2Ee) 2025/09/27(土) 05:36:45.87 ID:p3kzti810(1)調 AAS
自分が使った方がいいと思った時は使う。
しかないよ。後は規約や上司に従うぐらいか。
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.034s