!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
C++相談室 part166
1sage (ワッチョイ 8732-NXaD)
2025/04/26(土) 10:34:58.41ID:pbPDl6lv0614デフォルトの名無しさん (ワントンキン MMe6-+IOe)
2025/09/07(日) 16:53:15.89ID:2DaEs5aKM615デフォルトの名無しさん (ワッチョイ dbd6-ERpe)
2025/09/07(日) 17:20:59.28ID:yhbLpr+z0616デフォルトの名無しさん (ワッチョイ 1ba6-aHNR)
2025/09/07(日) 17:34:06.57ID:5bTmv8Qp0 参照メインの言語で書き換えを頻繁に行うとそりゃ事故るよ、注意力にも限界がある
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし
参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし
参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
617デフォルトの名無しさん (オッペケ Sr3b-wO3q)
2025/09/07(日) 18:17:46.03ID:kASsF2K3r ないしは、q=p; ってしたときに、pがダメになってくれるか
618デフォルトの名無しさん (ワントンキン MMe6-+IOe)
2025/09/07(日) 22:03:02.60ID:2DaEs5aKM >>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;
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.17ID:It1Ffdlu0620はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1732-F+lb)
2025/09/08(月) 10:27:54.64ID:bx3qX9/R0 状況を一から説明すると……
これは fifth が古い無効になった場所を参照する可能性があることが問題。
std::vector の各要素は連続した空間に配置されることが保証されている。
要素の増減でその場所の都合が悪くなれば再配置される可能性があり、
再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。
無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。
再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、
キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。
そんでもってこれのややこしいところは「可能性がある」ってところで、
キャパシティをどれくらい拡大するか実装によって差があるし、
状況によっては場所を移動せずに大きさを伸ばせるかもしれない。
つまり問題が顕在化しないかもしれない。
一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして
顕在化しやすいようにしたんだろう。
これは fifth が古い無効になった場所を参照する可能性があることが問題。
std::vector の各要素は連続した空間に配置されることが保証されている。
要素の増減でその場所の都合が悪くなれば再配置される可能性があり、
再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。
無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。
再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、
キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。
そんでもってこれのややこしいところは「可能性がある」ってところで、
キャパシティをどれくらい拡大するか実装によって差があるし、
状況によっては場所を移動せずに大きさを伸ばせるかもしれない。
つまり問題が顕在化しないかもしれない。
一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして
顕在化しやすいようにしたんだろう。
621デフォルトの名無しさん (ワッチョイ dbd6-ERpe)
2025/09/08(月) 10:47:28.92ID:It1Ffdlu0 >>620
どもです。要素数8ってのもさすがって感じでした。
どもです。要素数8ってのもさすがって感じでした。
622デフォルトの名無しさん (ワンミングク MM8a-+IOe)
2025/09/08(月) 22:24:25.56ID:EA0JjXQaM >>620
今回の問題に限ればその通り
ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと
今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる
既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた
参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある
これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する
両方の参照が書き換えを伴わないreadonlyの時のみ安全になる
片方もしくは両方の参照が書き換えを伴うと安全でなくなる
今回の問題に限ればその通り
ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと
今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる
既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた
参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある
これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する
両方の参照が書き換えを伴わないreadonlyの時のみ安全になる
片方もしくは両方の参照が書き換えを伴うと安全でなくなる
623デフォルトの名無しさん (ワッチョイ e3ad-ckwE)
2025/09/08(月) 23:06:53.70ID:HoahUzIM0 再配置が行われるものに参照使って、その生存期間を超えてアクセスするのは未定義動作になるわな。C++に慣れてればそんなコードは書かないが、初級者向けではない。readonly より、lifetime の問題でしょう
624デフォルトの名無しさん (ワッチョイ 177c-h0AF)
2025/09/09(火) 00:29:11.16ID:TMUamLpP0 参照が無効になる条件は規定されてるし、先にcapacity設定するとか避ける方法も用意されてる
「問題の本質」とやらはただのライブラリ仕様の無理解だろ
分かりにくいとか間違えやすいとかの批判なら分かるけど
「問題の本質」とやらはただのライブラリ仕様の無理解だろ
分かりにくいとか間違えやすいとかの批判なら分かるけど
625デフォルトの名無しさん (ワントンキン MM8a-+IOe)
2025/09/09(火) 07:24:41.95ID:DVL1/TmTM626デフォルトの名無しさん (ワントンキン MM8a-+IOe)
2025/09/09(火) 07:29:27.85ID:DVL1/TmTM627デフォルトの名無しさん (スフッ Sdba-bj1o)
2025/09/09(火) 10:47:02.21ID:g327vfuJd readonlyでない競合する参照を禁止している言語もある
628デフォルトの名無しさん (ワッチョイ 97e4-1jR+)
2025/09/09(火) 12:16:08.28ID:iPWQv8Oa0 はいはい線型論理言いたいだけ
629デフォルトの名無しさん (アウアウウー Sa47-Rd44)
2025/09/10(水) 00:51:51.50ID:BnR46AnOa >>618
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
630デフォルトの名無しさん (スッププ Sdba-j4tR)
2025/09/10(水) 02:12:52.51ID:IF/zSGeMd そうだよ。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
632デフォルトの名無しさん (ワッチョイ 4e1f-bj1o)
2025/09/10(水) 10:13:08.62ID:zTYInGVv0 >再構築されて新規の要素を保持してしまったで合ってますか
こう聴かれると「違う」と返事したくなる
こう聴かれると「違う」と返事したくなる
633デフォルトの名無しさん (ワッチョイ 177c-h0AF)
2025/09/10(水) 18:40:20.64ID:Vv9EwJFH0 未定義動作だからな
たまたま鼻から悪魔が出る代わりにそうなっただけだ
たまたま鼻から悪魔が出る代わりにそうなっただけだ
634デフォルトの名無しさん (ワッチョイ a75f-ckwE)
2025/09/10(水) 22:18:27.54ID:RAO/BxQt0 参照の競合という用語に違和感。並行性に関わる競合状態 (race condition) の話をしようとしているのか?
635デフォルトの名無しさん (ワッチョイ b68c-1jR+)
2025/09/10(水) 22:31:03.50ID:BZTqerG60 してない
636デフォルトの名無しさん (ワッチョイ a3d6-X2Ee)
2025/09/22(月) 23:24:45.15ID:ZT49UQS30 でわ 簡単?な話題を。
int data{}; ってやります? int data{0}; ってやります?
int data{}; ってやります? int data{0}; ってやります?
637デフォルトの名無しさん (ワッチョイ 7f7c-3pIy)
2025/09/23(火) 06:55:15.77ID:S9rfzcfC0 int data = 0; ってやる
638はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/23(火) 10:47:53.44ID:0b1Ncss10 auto data = 0;
とか、型が明示的なのが好みなら
auto data = int();
といった選択肢もある。
私は
int data = 0;
派だけど。
とか、型が明示的なのが好みなら
auto data = int();
といった選択肢もある。
私は
int data = 0;
派だけど。
639デフォルトの名無しさん (ワッチョイ 8a02-CSnM)
2025/09/23(火) 10:57:08.68ID:NP1ck5iL0640はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/23(火) 11:12:21.28ID:0b1Ncss10641デフォルトの名無しさん (ワッチョイ 8a02-CSnM)
2025/09/23(火) 11:17:00.61ID:NP1ck5iL0642デフォルトの名無しさん (ワッチョイ a3d6-X2Ee)
2025/09/23(火) 12:32:51.63ID:zwbfimRS0 >>638
イテレータの返しを受けるオブジェクトはauto使うと便利みたいな
イテレータの返しを受けるオブジェクトはauto使うと便利みたいな
643デフォルトの名無しさん (ワッチョイ 46f6-RvFB)
2025/09/23(火) 14:23:55.04ID:SO+rqWsF0644はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/23(火) 14:48:06.92ID:0b1Ncss10 前提条件を変えると何でも言えてしまう。
とりあえずここでは発端は >>636 なのだから変数 data の型が int であり (多相にはしない) 内容はゼロで初期化するという狭い仮定を置いたほうがよかろう。
auto を持ち出したのは変に話題を曲げてしまったな。すまぬ。
とりあえずここでは発端は >>636 なのだから変数 data の型が int であり (多相にはしない) 内容はゼロで初期化するという狭い仮定を置いたほうがよかろう。
auto を持ち出したのは変に話題を曲げてしまったな。すまぬ。
645デフォルトの名無しさん (オッペケ Sr23-RsoB)
2025/09/23(火) 20:34:08.12ID:3YWvMRZsr 今北
いまさら人に聞けない
auto って、右辺の型もそのまま左辺にコピーしてきてよ、って感じで使ってるんだけど
その認識で間違ってない? 落とし穴とかある?
いまさら人に聞けない
auto って、右辺の型もそのまま左辺にコピーしてきてよ、って感じで使ってるんだけど
その認識で間違ってない? 落とし穴とかある?
646デフォルトの名無しさん (ワッチョイ 467f-IpVF)
2025/09/23(火) 20:39:56.49ID:7uroOMzl0 右辺が式の場合もあるし
その時自分が思ってた型とautoの型が一致するとは限らないところとか
その時自分が思ってた型とautoの型が一致するとは限らないところとか
647デフォルトの名無しさん (ワッチョイ 73f0-ar7H)
2025/09/23(火) 21:26:37.10ID:qWXNEai60 autoで手抜きしすぎるとあとでソース追うときにエライ苦労することあるから気を付けろよ
648デフォルトの名無しさん (ワッチョイ 8a02-CSnM)
2025/09/23(火) 21:34:42.79ID:NP1ck5iL0649はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e328-BMc3)
2025/09/24(水) 02:24:38.07ID:hHyw0Adk0 >>645
その認識でおおよそ正しいが変則的な部分もある。
auto foo = { 1, 2, 3 };
みたいに書くと initializer_list に推論されたりするのは知らないとちょっとびっくりするかもしれない。
それと修飾子などを組み合わせで使うことも出来る。
const auto* bar = &baz;
みたいに。
その認識でおおよそ正しいが変則的な部分もある。
auto foo = { 1, 2, 3 };
みたいに書くと initializer_list に推論されたりするのは知らないとちょっとびっくりするかもしれない。
それと修飾子などを組み合わせで使うことも出来る。
const auto* bar = &baz;
みたいに。
650デフォルトの名無しさん (ワッチョイ 8a02-CSnM)
2025/09/24(水) 07:20:39.19ID:tMR45KsJ0651はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-VPhE)
2025/09/24(水) 08:23:07.29ID:yL+cLVSS0 >>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 は関数テンプレートだとする
// ここでなんやかんや
}
みたいになってわずらわしい。
初期化子の型をそのまま持ってくれば良いときに型を明示しても可読性に貢献しないし、簡便な記法があると楽。
ゆるいというのがどういう意味で言ってるのかわからないからなんとも言えない。
特に有用なのはテンプレート内で、たとえば
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.78ID:4f1PT/5nH std::make_sharedとか使うと行が長くなりがちだからauto便利
653デフォルトの名無しさん (ワッチョイ 4a4e-rfem)
2025/09/24(水) 23:18:51.30ID:OQUpbPvH0 autoでしか出来ないこともあるから奥が深い
654デフォルトの名無しさん (ワッチョイ e3a6-YvLc)
2025/09/24(水) 23:47:45.55ID:wXWMV3aG0 罠仕様が仕込まれてるってだけでは
655デフォルトの名無しさん (オッペケ Sr23-RsoB)
2025/09/25(木) 06:56:54.48ID:iHrblX0Rr Rust派に言わせれば、C++が罠らしいぞw
でもそのC++が、今の俺を生んだ
でもそのC++が、今の俺を生んだ
656デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/25(木) 16:58:42.68ID:tx4jrZ/E0 有用なときもあるけど、ライブラリ用のコードで乱発するとメンテナンスが大変
可読性メンテナンス性を考えるなら、冗長でない限りはちゃんと書いた方がいい
>>651
それもbaz(buz?)の戻り値の型はTから導出出来るんだから、よほどややこしくない限りはそれ(decltypeで手抜きせずに)を書いた方が可読性メンテナンス性の面では良い
可読性メンテナンス性を考えるなら、冗長でない限りはちゃんと書いた方がいい
>>651
それもbaz(buz?)の戻り値の型はTから導出出来るんだから、よほどややこしくない限りはそれ(decltypeで手抜きせずに)を書いた方が可読性メンテナンス性の面では良い
657デフォルトの名無しさん (ワッチョイ 4640-RvFB)
2025/09/25(木) 17:00:57.66ID:/3f9OB3n0 >>656
お前テンプレートプログラミングの素人さんだよね
お前テンプレートプログラミングの素人さんだよね
658デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/25(木) 20:40:29.81ID:tx4jrZ/E0 >>657
自己紹介乙w
Expression Template使って線形代数のライブラリ作った人間だが、ETで利用者がauto使うとどういう問題が起きるか答えてみ
まさか分かりませんとか言わないよな?
テンプレート使ったライブラリ(てか標準ライブラリ)を"利用する"しかしたことのない人間が調子に乗るな
自己紹介乙w
Expression Template使って線形代数のライブラリ作った人間だが、ETで利用者がauto使うとどういう問題が起きるか答えてみ
まさか分かりませんとか言わないよな?
テンプレート使ったライブラリ(てか標準ライブラリ)を"利用する"しかしたことのない人間が調子に乗るな
659デフォルトの名無しさん (ワッチョイ 3b82-IpVF)
2025/09/25(木) 20:43:04.50ID:nRsNESWS0 なんか「その理論を作ったのは私ですが」みたいなものを感じる
技術発表の際の怖い質問とかなんとかのやつw
技術発表の際の怖い質問とかなんとかのやつw
660デフォルトの名無しさん (ワッチョイ 4a4e-rfem)
2025/09/25(木) 20:43:46.25ID:ofoI5OnU0 言葉ならなんとでも言えるわな
661650 (ワッチョイ 8a02-CSnM)
2025/09/25(木) 20:44:29.25ID:hN2fGih80662650 (ワッチョイ 8a02-CSnM)
2025/09/25(木) 20:46:08.51ID:hN2fGih80663デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/25(木) 20:54:22.86ID:tx4jrZ/E0664デフォルトの名無しさん (ワッチョイ ff67-ZW/Z)
2025/09/25(木) 21:36:33.99ID:SUv+BSiy0 今ならconceptを使うのが筋が良いんだろうな
他の言語みたいに型制約を書かずにジェネリクスを使えるけど、これは良くも悪くもだよね
楽と言えば楽だけど
他の言語みたいに型制約を書かずにジェネリクスを使えるけど、これは良くも悪くもだよね
楽と言えば楽だけど
665デフォルトの名無しさん (ワッチョイ 7307-RsoB)
2025/09/26(金) 01:34:47.37ID:aJA0eUoF0666デフォルトの名無しさん (ブーイモ MMbb-RvFB)
2025/09/26(金) 01:53:11.78ID:IAhZoqBcM >>658
端的に言って
> それもbaz(buz?)の戻り値の型はTから導出出来るんだから、
ここだよ
関数テンプレートなんだから型が導出できるとは限らない
なぜお前は断言したのかな?
導出できない例にぶち当たったことがないからだよな
端的に言って
> それもbaz(buz?)の戻り値の型はTから導出出来るんだから、
ここだよ
関数テンプレートなんだから型が導出できるとは限らない
なぜお前は断言したのかな?
導出できない例にぶち当たったことがないからだよな
667デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 07:26:52.27ID:uQKo8FSG0668デフォルトの名無しさん (ワッチョイ 8e02-C7mS)
2025/09/26(金) 08:15:01.31ID:FGFv/5hn0 conceptはテンプレートだけじゃなく普通の変数制約にも使えればなぁ。
継承がほとんどいらなくなる。
継承がほとんどいらなくなる。
669デフォルトの名無しさん (アウアウウー Sacf-kv3/)
2025/09/26(金) 10:28:59.69ID:UkFmEBgMa >>647
判ります
判ります
670デフォルトの名無しさん (ワッチョイ 5301-QugL)
2025/09/26(金) 11:12:51.14ID:TfDLIQWg0 手抜きというか情報を重複させないためにはautoが必要
苦労するのは型情報を追えないツールが悪い
苦労するのは型情報を追えないツールが悪い
671デフォルトの名無しさん (ワッチョイ bff0-ar7H)
2025/09/26(金) 11:53:52.65ID:IRzSnzQy0672はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-VPhE)
2025/09/26(金) 12:02:33.14ID:E9e6Z1Un0 expression template を auto で受けるとまずいってのは Eigen みたいな設計の話かな。
あれはムーブがない時代の設計だから一時オブジェクトの参照を保持してしまう (先に一時オブジェクトが解体されて寿命管理が破綻する) のが問題なのであって、解決のための仕組みが与えられたにもかかわらずそれを使ってない設計が悪い。
expression template の仕組み上でどうしても解決できないというわけではないし auto のせいでもない。
ムーブのコストすら許容できないだとか、古い C++ (C++03 以前) もサポートしなきゃならないみたいな事情があるなら「すまんけどこのライブラリを使うときは注意して」というべき筋合いの話で、「auto なんか使っとるからじゃ!」みたいな態度はおかしいだろ。
あれはムーブがない時代の設計だから一時オブジェクトの参照を保持してしまう (先に一時オブジェクトが解体されて寿命管理が破綻する) のが問題なのであって、解決のための仕組みが与えられたにもかかわらずそれを使ってない設計が悪い。
expression template の仕組み上でどうしても解決できないというわけではないし auto のせいでもない。
ムーブのコストすら許容できないだとか、古い C++ (C++03 以前) もサポートしなきゃならないみたいな事情があるなら「すまんけどこのライブラリを使うときは注意して」というべき筋合いの話で、「auto なんか使っとるからじゃ!」みたいな態度はおかしいだろ。
673デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 12:09:27.62ID:uQKo8FSG0 >>672
>のが問題なのであって
違う。ETの場合、関数(演算子オーバーロード含む)が返すのは、式の構造を表すオブジェクトなのでそれをautoで受けると式の展開が行われず、計算処理の無いコードになってしまう
それを逆手に取ってauto経由で展開のタイミング遅らせることもできるけどね
あとETの利点はムーブどうこうで解決できる問題だけではないし、
誰も「ETを万人が使うべき」だなどと言っとらんよ、何が気に入らんかったの?
で、はちみつお前いつも「知ったかぶりしていい加減なことを言う奴」に怒ってる割に、自分も同じ事してるよな
>のが問題なのであって
違う。ETの場合、関数(演算子オーバーロード含む)が返すのは、式の構造を表すオブジェクトなのでそれをautoで受けると式の展開が行われず、計算処理の無いコードになってしまう
それを逆手に取ってauto経由で展開のタイミング遅らせることもできるけどね
あとETの利点はムーブどうこうで解決できる問題だけではないし、
誰も「ETを万人が使うべき」だなどと言っとらんよ、何が気に入らんかったの?
で、はちみつお前いつも「知ったかぶりしていい加減なことを言う奴」に怒ってる割に、自分も同じ事してるよな
674デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 12:11:01.51ID:uQKo8FSG0 あと
>「auto なんか使っとるからじゃ!」
一言も言ってないんだが。流れ読み直しておいで
>「auto なんか使っとるからじゃ!」
一言も言ってないんだが。流れ読み直しておいで
675はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/26(金) 12:54:00.88ID:E9e6Z1Un0 >>672
> autoで受けると式の展開が行われず、計算処理の無いコードになってしまう
書いてなかったが評価タイミングは適当な関数で明示的にする前提を置いてた。
未定義を踏むのは他の何と比べても駄目だ。単に思ってた結果と違ったなんてのは重要じゃない。
> 誰も「ETを万人が使うべき」だなどと言っとらんよ、何が気に入らんかったの?
日常的には使わないケースだからこそだ。
それが auto の問題点のように挙げられてただろ?
ライブラリのほうが C++ の自然な習慣に合わせるのが筋なのにさ。
> autoで受けると式の展開が行われず、計算処理の無いコードになってしまう
書いてなかったが評価タイミングは適当な関数で明示的にする前提を置いてた。
未定義を踏むのは他の何と比べても駄目だ。単に思ってた結果と違ったなんてのは重要じゃない。
> 誰も「ETを万人が使うべき」だなどと言っとらんよ、何が気に入らんかったの?
日常的には使わないケースだからこそだ。
それが auto の問題点のように挙げられてただろ?
ライブラリのほうが C++ の自然な習慣に合わせるのが筋なのにさ。
676デフォルトの名無しさん (ササクッテロラ Sp23-P6+q)
2025/09/26(金) 13:15:19.27ID:4po4sxfpp677デフォルトの名無しさん (ササクッテロラ Sp23-P6+q)
2025/09/26(金) 13:19:26.24ID:4po4sxfpp >>675
あと、ETで式の評価が発生するのは関数の呼び出し時ではない。どうでもいいけど
あと俺が作ったのは4次元まで(行列なら4x4まで。ゲーム用なので)だからヒープ使わんのでそもそもムーブどうこうは関係無いし、勝手によそのライブラリの未定義の話を持ってこられても困る
あと、ETで式の評価が発生するのは関数の呼び出し時ではない。どうでもいいけど
あと俺が作ったのは4次元まで(行列なら4x4まで。ゲーム用なので)だからヒープ使わんのでそもそもムーブどうこうは関係無いし、勝手によそのライブラリの未定義の話を持ってこられても困る
678はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/26(金) 13:57:45.37ID:E9e6Z1Un0 >>677
eigen は例として話題に出したつもりだったが余計だったな。
端的に主旨を言えば expression template の原理的には auto で受けれるように作ることは可能、かつその方が親切な作りだろうという話をしてる。
お前がどんな設計をしたのかなんてそれこそ俺には知ったことじゃないし、知りようもない。
お前のライブラリで auto で受けれないのはお前がそう設計しただけの話なので、 それを根拠に auto がどうこう言ってもなんの足しにもならん。
eigen は例として話題に出したつもりだったが余計だったな。
端的に主旨を言えば expression template の原理的には auto で受けれるように作ることは可能、かつその方が親切な作りだろうという話をしてる。
お前がどんな設計をしたのかなんてそれこそ俺には知ったことじゃないし、知りようもない。
お前のライブラリで auto で受けれないのはお前がそう設計しただけの話なので、 それを根拠に auto がどうこう言ってもなんの足しにもならん。
679デフォルトの名無しさん (ササクッテロラ Sp23-P6+q)
2025/09/26(金) 14:04:20.28ID:4po4sxfpp680はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/26(金) 14:08:11.66ID:E9e6Z1Un0 >>679
悪い設計のせいで利用者に不自然な書き方を強いるライブラリを作ったという話だということは理解してる。
悪い設計のせいで利用者に不自然な書き方を強いるライブラリを作ったという話だということは理解してる。
681デフォルトの名無しさん (ササクッテロラ Sp23-P6+q)
2025/09/26(金) 14:13:42.65ID:4po4sxfpp あといちいち知ったかぶってるバカに教えてやるのも腹が立つが、普通数値演算でET使うときは代入演算子やコンストラクタに式を渡した場所で初めて式を展開するんだよ
(autoでわざと評価を遅延させることも可能だと書いただろアホ)
Eigenでも多分そう
もちろんboost::spiritとかの構文解析ならパース処理の関数に渡すまで展開しないだろうが
(autoでわざと評価を遅延させることも可能だと書いただろアホ)
Eigenでも多分そう
もちろんboost::spiritとかの構文解析ならパース処理の関数に渡すまで展開しないだろうが
682デフォルトの名無しさん (ササクッテロラ Sp23-P6+q)
2025/09/26(金) 14:14:19.90ID:4po4sxfpp >>680
不自然なのはお前の、「スキルに見合わない自尊心」だと思うぞ
不自然なのはお前の、「スキルに見合わない自尊心」だと思うぞ
683デフォルトの名無しさん (ササクッテロラ Sp23-P6+q)
2025/09/26(金) 14:24:32.42ID:4po4sxfpp684デフォルトの名無しさん
2025/09/26(金) 17:03:47.95ID:iKKvsVQ80 お前ってのははちみつのこと言ってるのかね?
自分から絡んどいて何言ってんだろうコイツとしか思えんけど
自分から絡んどいて何言ってんだろうコイツとしか思えんけど
685デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 17:53:41.26ID:uQKo8FSG0686デフォルトの名無しさん (ワッチョイ 467f-RvFB)
2025/09/26(金) 19:18:42.84ID:+hZbpaFa0 >>685
ラムダの型導出できないだろ?
なんでこんなのも知らんのにえらそうにしてんの?
あと
https://wandbox.org/permlink/q5sTF1hp76f7jpnq
とかな
この例でfooでもif constexprを使えばautoはなくせるがそんなことやって可読性とかほざけない
他にもパターンあるぞ
謝罪してお前が作ったらしいヘボライブラリ公開したら教えてやってもいいぞ
ラムダの型導出できないだろ?
なんでこんなのも知らんのにえらそうにしてんの?
あと
https://wandbox.org/permlink/q5sTF1hp76f7jpnq
とかな
この例でfooでもif constexprを使えばautoはなくせるがそんなことやって可読性とかほざけない
他にもパターンあるぞ
謝罪してお前が作ったらしいヘボライブラリ公開したら教えてやってもいいぞ
687デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 19:32:01.31ID:uQKo8FSG0 屁理屈にも程がある
導出出来なきゃどうやって実体化するんだよ、Tしかテンプレートパラメータが無い状況でT以外に依存するものがあるのか?
まさか結果がTに依存するテンプレートになったら「導出出来てない」とかほざくの?
Tに依存するコンテナのイテレータと何も変わらんよそれ
導出出来なきゃどうやって実体化するんだよ、Tしかテンプレートパラメータが無い状況でT以外に依存するものがあるのか?
まさか結果がTに依存するテンプレートになったら「導出出来てない」とかほざくの?
Tに依存するコンテナのイテレータと何も変わらんよそれ
688デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 20:12:50.41ID:uQKo8FSG0 てかその例でauto使わずに戻り値格納するのにif constexpr使うしかないと思ってるとかどんだけ経験不足なんだ・・・(はっきり処理分けする必要がある場合を除く)
そんなクソみたいな例ならさすがにdecltypeかauto使いたくなるが(そもそも使うなと言ってないんだが)、conditionalも知らんのかお前は
必死に探してきてご苦労さん
そんなクソみたいな例ならさすがにdecltypeかauto使いたくなるが(そもそも使うなと言ってないんだが)、conditionalも知らんのかお前は
必死に探してきてご苦労さん
689デフォルトの名無しさん (ワッチョイ 7307-RsoB)
2025/09/26(金) 20:41:40.17ID:aJA0eUoF0 あの…そろそろ言っとくが
おもろいこと書いたヤツが優勝な?
2ちゃん5ちゃんの原則だぞ
おもろいこと書いたヤツが優勝な?
2ちゃん5ちゃんの原則だぞ
690デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/26(金) 20:46:36.85ID:uQKo8FSG0 >>665はおもろいと自分で思ってんの?w
691デフォルトの名無しさん (ワッチョイ 467f-RvFB)
2025/09/26(金) 20:59:48.54ID:+hZbpaFa0692デフォルトの名無しさん (ワッチョイ 8a02-CSnM)
2025/09/27(土) 00:06:32.90ID:ov4hhnsF0 やっぱautoはゆるいね
C#とかPython的な感じ…
C#とかPython的な感じ…
693デフォルトの名無しさん (ワッチョイ 7307-RsoB)
2025/09/27(土) 05:08:15.66ID:rNLW6nkI0 C++は自由なんだよ
変な風にも使えるし、傍で見てたらめちゃくちゃにもなる
変な風にも使えるし、傍で見てたらめちゃくちゃにもなる
694デフォルトの名無しさん (ワッチョイ 1ed6-X2Ee)
2025/09/27(土) 05:36:45.87ID:p3kzti810 自分が使った方がいいと思った時は使う。
しかないよ。後は規約や上司に従うぐらいか。
しかないよ。後は規約や上司に従うぐらいか。
695デフォルトの名無しさん (ワッチョイ 7f7c-3pIy)
2025/09/27(土) 11:22:44.98ID:0x5FUGdK0 久々にC++スレらしくなってておっちゃん楽しいよ
696はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-VPhE)
2025/09/27(土) 17:37:01.17ID:nSvwU9re0 >>681
コンストラクタや代入演算子で実際の計算を起動する方式も支持があるのは知ってるよ。
だからその代表例として有名どころの Eigen を話題に出したのだし、そこに齟齬はない。
その上で唯一の方式ではないし悪い設計だと言ってる。
私に反論するならどうしてそんな方式を取るのか利点 (悪い設計ではない理由) を説明すべきだった。
「数値計算で expression template を使うときは普通」なんて情報量ゼロのことを書かれても何の意味も感じられない。
コンストラクタや代入演算子をトリガーにするのは expression template を最適化として使う考え方だ。
つまり見かけ上は普通に式を書いてるだけなのに実は高速化しているというのがキモで、普通の式である「かのように」見える抽象化に意味がある。
実際の型を意識せざるを得なくなった段階で抽象化は破綻してる。
auto を使ったら何が起こるかを意識しなければならないのはライブラリ設計の失敗なんだよ。
隠れていたりいなかったりする半端な抽象化層を悪い設計と呼ぶのは間違ってるか?
> 再三言うが、>>658は>>657を叩くために出した問いに過ぎない
> 「意図しないコードになる」という話
そんなので意図しないコードになってしまうような作りのライブラリは出来が悪いという話なのはかわらん。
様々な事情に配慮してそうならざるを得ないということもあるというのならわかるが、
そうじゃなくて「それが普通なんだ」と思い込んだ狭い見識での判断なんだろ?
型を書くか auto にするかはスタイルの問題で、どちらを使うかで挙動が切り替わってしまうような設計のライブラリが本当にまともか?
コンストラクタや代入演算子で実際の計算を起動する方式も支持があるのは知ってるよ。
だからその代表例として有名どころの Eigen を話題に出したのだし、そこに齟齬はない。
その上で唯一の方式ではないし悪い設計だと言ってる。
私に反論するならどうしてそんな方式を取るのか利点 (悪い設計ではない理由) を説明すべきだった。
「数値計算で expression template を使うときは普通」なんて情報量ゼロのことを書かれても何の意味も感じられない。
コンストラクタや代入演算子をトリガーにするのは expression template を最適化として使う考え方だ。
つまり見かけ上は普通に式を書いてるだけなのに実は高速化しているというのがキモで、普通の式である「かのように」見える抽象化に意味がある。
実際の型を意識せざるを得なくなった段階で抽象化は破綻してる。
auto を使ったら何が起こるかを意識しなければならないのはライブラリ設計の失敗なんだよ。
隠れていたりいなかったりする半端な抽象化層を悪い設計と呼ぶのは間違ってるか?
> 再三言うが、>>658は>>657を叩くために出した問いに過ぎない
> 「意図しないコードになる」という話
そんなので意図しないコードになってしまうような作りのライブラリは出来が悪いという話なのはかわらん。
様々な事情に配慮してそうならざるを得ないということもあるというのならわかるが、
そうじゃなくて「それが普通なんだ」と思い込んだ狭い見識での判断なんだろ?
型を書くか auto にするかはスタイルの問題で、どちらを使うかで挙動が切り替わってしまうような設計のライブラリが本当にまともか?
697デフォルトの名無しさん (ワッチョイ 0679-P6+q)
2025/09/27(土) 17:54:13.79ID:iipvXy1W0 よほど悔しかったんか知らんが、恥の上塗りやめたら?
autoをC++に取り込んだ人達は、お前が調子に乗るために提案したわけでも採用したわけでもなかろうよ
autoをC++に取り込んだ人達は、お前が調子に乗るために提案したわけでも採用したわけでもなかろうよ
698デフォルトの名無しさん (アウアウウー Sacf-kv3/)
2025/09/27(土) 19:49:03.02ID:k7oMySGea699はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/27(土) 20:00:56.28ID:nSvwU9re0 C++ が設計ミスだらけなのは今更な話だろ。
700580 (ワッチョイ f5a1-hkyQ)
2025/09/28(日) 18:27:48.51ID:MSQtxm6D0 解決しますた!
701はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2d32-jLB2)
2025/09/28(日) 19:20:47.09ID:pjQge+jC0 そうか。
702デフォルトの名無しさん (ワッチョイ 4366-WwN1)
2025/09/29(月) 19:03:56.70ID:ALxfRd8b0 VSCode(WSL)のclang-tidyで質問です
関数にconst付けるのを警告する「readability-make-member-function-const」って奴ですがDoSave()関数にも警告が出ます
可能ならgetterのみに付けたいのですが皆さんこれはどうされてますか?
無効にしてるか、無視してるか、const付けてるか、その他何かやってますか?
C++の環境構築は初めてなので助言をいただけるとありがたいです
よろしくお願いします
関数にconst付けるのを警告する「readability-make-member-function-const」って奴ですがDoSave()関数にも警告が出ます
可能ならgetterのみに付けたいのですが皆さんこれはどうされてますか?
無効にしてるか、無視してるか、const付けてるか、その他何かやってますか?
C++の環境構築は初めてなので助言をいただけるとありがたいです
よろしくお願いします
703デフォルトの名無しさん (ワッチョイ 2d7c-2Udd)
2025/09/29(月) 19:56:30.29ID:BDszbKFL0 こういうこと?
要はconst性を「セーブさせたくない」という符丁に使いたいのかな
class Hoge; // DoSave()持ち
void foo(Hoge& h1, const Hoge& ch2)
{
h1.DoSave(); //ゆるす
ch2.DoSave(); //ゆるさない
}
そんな変なことやめとけとしか思わないけど、どうしてもそうしたい理由があるなら言ってみ
要はconst性を「セーブさせたくない」という符丁に使いたいのかな
class Hoge; // DoSave()持ち
void foo(Hoge& h1, const Hoge& ch2)
{
h1.DoSave(); //ゆるす
ch2.DoSave(); //ゆるさない
}
そんな変なことやめとけとしか思わないけど、どうしてもそうしたい理由があるなら言ってみ
704デフォルトの名無しさん (ワッチョイ adf0-pGVw)
2025/09/29(月) 20:49:50.37ID:Qgirjd9Z0 const_cast<Hoge*>(&ch2)->DoSave();
705デフォルトの名無しさん (ワッチョイ 4376-Duv+)
2025/09/29(月) 22:22:15.60ID:ALxfRd8b0 >> 703-704
すみませんサンプルを載せるべきでした
ソース:
double Point::X(){return x;}
void Point::X(double value){ x=value;}
ヘッダ:
static Point {
public:
double X();
void X(double value);
private :
double x=0;
};
clang-tidy を実行すると「double Point::X()」のX部分で「Method 'X' can be made const (readability-make-member-function-const)」という警告が出ます
調べてみると「constを追加して、内容が変更されないことを明確にすべき」らしいです
ソース:double Point::X() const {return x;}
ヘッダ:double X() const;
上記だけなら問題無いのですが、下記のような関数にも同じ警告が出てしまいます
ソース:void Sample::DoSave(){ ファイルの保存処理 }
ヘッダ:void DoSave();
この場合、getterではなく処理なので、const は付けるべきでは無いと考えてます
そこで質問ですが、clang-tidy で静的チェックを行う場合「readability-make-member-function-const」の扱いはどうすべきなのか気になった次第です
「無効にすればいいのか」と思いながらも、C#のプロパティではないので、「C++は変更されないことを明示した方が分かりやすいのか?」とどのように設定すべきか悩んでいます
よろしくお願いします
環境は下記:VSCode、ubuntu 22.04 (WSL)、C++ 17、clang-tidy-15
すみませんサンプルを載せるべきでした
ソース:
double Point::X(){return x;}
void Point::X(double value){ x=value;}
ヘッダ:
static Point {
public:
double X();
void X(double value);
private :
double x=0;
};
clang-tidy を実行すると「double Point::X()」のX部分で「Method 'X' can be made const (readability-make-member-function-const)」という警告が出ます
調べてみると「constを追加して、内容が変更されないことを明確にすべき」らしいです
ソース:double Point::X() const {return x;}
ヘッダ:double X() const;
上記だけなら問題無いのですが、下記のような関数にも同じ警告が出てしまいます
ソース:void Sample::DoSave(){ ファイルの保存処理 }
ヘッダ:void DoSave();
この場合、getterではなく処理なので、const は付けるべきでは無いと考えてます
そこで質問ですが、clang-tidy で静的チェックを行う場合「readability-make-member-function-const」の扱いはどうすべきなのか気になった次第です
「無効にすればいいのか」と思いながらも、C#のプロパティではないので、「C++は変更されないことを明示した方が分かりやすいのか?」とどのように設定すべきか悩んでいます
よろしくお願いします
環境は下記:VSCode、ubuntu 22.04 (WSL)、C++ 17、clang-tidy-15
706デフォルトの名無しさん (ワッチョイ 1b39-ZlhK)
2025/09/29(月) 23:01:05.35ID:jk3QzjEU0 NOLINT
707デフォルトの名無しさん
2025/09/29(月) 23:04:57.63ID:rfIMSjI90 >>705
その場合const付けたほうが良い理由は「変更されないことを明示」することより
constのインスタンスに対してその関数を呼べなくなることでは?
↓はエラーか警告(どっちかは忘れた)になると思う(constオブジェクトの非constメンバ関数は呼び出せない)
void SaveData(const Sample sample)
{
sample.DoSave();
}
void Sample::DoSave() const { ファイルの保存処理 }
にしておけば、DoSaveは呼び出せる
その場合const付けたほうが良い理由は「変更されないことを明示」することより
constのインスタンスに対してその関数を呼べなくなることでは?
↓はエラーか警告(どっちかは忘れた)になると思う(constオブジェクトの非constメンバ関数は呼び出せない)
void SaveData(const Sample sample)
{
sample.DoSave();
}
void Sample::DoSave() const { ファイルの保存処理 }
にしておけば、DoSaveは呼び出せる
708デフォルトの名無しさん (ワッチョイ adf0-pGVw)
2025/09/30(火) 01:33:12.30ID:Xmjd+d/v0 処理だからconst付けないんじゃなくて、そのメンバ関数がPointクラスの中身を書き変えないことを保証するためにメンバ関数の後ろにconstは付ける
つまり、Save処理はPointクラスを特段変更するメソッドではないだろ?
だったらconstは付けるべき
つまり、Save処理はPointクラスを特段変更するメソッドではないだろ?
だったらconstは付けるべき
709デフォルトの名無しさん (ワッチョイ 2d7c-2Udd)
2025/09/30(火) 07:07:46.33ID:NaKN2pJV0 >>705
つまり、constを本来の意味(中身を変更するかどうか)ではなく「getterであるかどうか」を示すラベルとして使いたいってことでしょ?
で、何を持って「getterであるかどうか」はあなたの頭の中にしかない定義であって、そのlintはもちろんコンパイラもエディタも世のライブラリも知ったことではない
それらをオレオレconstラベルに適合させるためにどうしたらいいか?というのがあなたの問うていることだ
やっぱりどうしてそんなことがしたいのか全く理解できない
つまり、constを本来の意味(中身を変更するかどうか)ではなく「getterであるかどうか」を示すラベルとして使いたいってことでしょ?
で、何を持って「getterであるかどうか」はあなたの頭の中にしかない定義であって、そのlintはもちろんコンパイラもエディタも世のライブラリも知ったことではない
それらをオレオレconstラベルに適合させるためにどうしたらいいか?というのがあなたの問うていることだ
やっぱりどうしてそんなことがしたいのか全く理解できない
710はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2d32-jLB2)
2025/09/30(火) 08:58:44.76ID:0fqHawiZ0 >>705
オブジェクトがなんらかのストレージを抽象化したものであると考えたらそのオブジェクトが const であるときはセーブ機能を使えないようにしたいというのはわからんでもない。
実際の管理は他の場所でやっていて窓口に過ぎないならメンバ関数に const を付加可能 (だがそうしたくない) なこともあるだろう。
それが良い設計かどうかは脇に置いてそうすることに決めたときに clang-tidy の警告はどうすればいいのかということなら、
例外的な状況なので例外的なものとして無視してもらうしか仕方ないんじゃないか。
NOLINT コメントを書いておくと clang-tidy はその箇所については警告を抑制してくれるよ。
オブジェクトがなんらかのストレージを抽象化したものであると考えたらそのオブジェクトが const であるときはセーブ機能を使えないようにしたいというのはわからんでもない。
実際の管理は他の場所でやっていて窓口に過ぎないならメンバ関数に const を付加可能 (だがそうしたくない) なこともあるだろう。
それが良い設計かどうかは脇に置いてそうすることに決めたときに clang-tidy の警告はどうすればいいのかということなら、
例外的な状況なので例外的なものとして無視してもらうしか仕方ないんじゃないか。
NOLINT コメントを書いておくと clang-tidy はその箇所については警告を抑制してくれるよ。
711デフォルトの名無しさん (スッップ Sd43-WwN1)
2025/09/30(火) 10:38:19.22ID:Dzyyn8xKd >>706-710
御返事がおそくなりすみません
ご意見ありがとうございます
自分の理解不足と設計思想が間違ってるまたはずれてるんだと理解しました
・「readability-make-member-function-const」の指示にしたがってconstを付けるのが良い
・更に言うと-fixオプションで自動付与するレベルの内容
・だけどNOLINTで無視もできるよ(無視してるとは言ってない)
ってことで理解しました
勉強になりました
ありがとうございます
御返事がおそくなりすみません
ご意見ありがとうございます
自分の理解不足と設計思想が間違ってるまたはずれてるんだと理解しました
・「readability-make-member-function-const」の指示にしたがってconstを付けるのが良い
・更に言うと-fixオプションで自動付与するレベルの内容
・だけどNOLINTで無視もできるよ(無視してるとは言ってない)
ってことで理解しました
勉強になりました
ありがとうございます
712デフォルトの名無しさん (ワッチョイ 2596-TDpG)
2025/09/30(火) 21:38:35.37ID:bXNPhBlr0 VC++20のテンプレート制約で不可思議なことが起きるのだけど、以下の二つは同じ意味だよね?
1だと目的通りTParentに該当static関数<T>があれば適用、なければスルーという挙動になるのだけど、
2だと無くても適用されちゃって他を探しに行かずにオーバーロード未解決に陥るんだけどどういうことだろう?
1
template<typename T, typename TParent> concept HasSizeGetter = requires { (size_t)TParent::template get_size<T>(); };
template<HasSizeGetter<TParent> T> static consteval size_t get_require_space() { return TParent::get_size<T>(); }
2
template<typename T> requires requires { (size_t)TParent::template get_size<T>(); } static consteval size_t get_size() { return TParent::get_size<T>(); }
1だと目的通りTParentに該当static関数<T>があれば適用、なければスルーという挙動になるのだけど、
2だと無くても適用されちゃって他を探しに行かずにオーバーロード未解決に陥るんだけどどういうことだろう?
1
template<typename T, typename TParent> concept HasSizeGetter = requires { (size_t)TParent::template get_size<T>(); };
template<HasSizeGetter<TParent> T> static consteval size_t get_require_space() { return TParent::get_size<T>(); }
2
template<typename T> requires requires { (size_t)TParent::template get_size<T>(); } static consteval size_t get_size() { return TParent::get_size<T>(); }
713デフォルトの名無しさん (ワッチョイ 2596-TDpG)
2025/09/30(火) 21:40:50.61ID:bXNPhBlr0 ちょっと書き間違えてたけど1はget_require_spaceじゃなくてちゃんと2と同じくget_sizeね
714はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2d32-jLB2)
2025/09/30(火) 23:39:48.15ID:0fqHawiZ0 >>712
オーバーロード未解決という形で現れるのはよくわからないけど
この場合はその関数テンプレートを使わなくても (呼び出さなくても) エラーになるのが正しい挙動だと思う。
get_size は依存名ではないのでテンプレートの定義時 (テンプレート実引数を当てはめる前) に名前のルックアップが試みられて失敗する。
requires 節はテンプレート引数の妥当性を検証する仕組みなのでテンプレート引数をあてはめなくても式が不成立になるようなのはエラー。
というのが私の理解なんだけどあんまり自信はない……。
オーバーロード未解決という形で現れるのはよくわからないけど
この場合はその関数テンプレートを使わなくても (呼び出さなくても) エラーになるのが正しい挙動だと思う。
get_size は依存名ではないのでテンプレートの定義時 (テンプレート実引数を当てはめる前) に名前のルックアップが試みられて失敗する。
requires 節はテンプレート引数の妥当性を検証する仕組みなのでテンプレート引数をあてはめなくても式が不成立になるようなのはエラー。
というのが私の理解なんだけどあんまり自信はない……。
レスを投稿する
ニュース
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 【映画】『クレヨンしんちゃん』 中国で公開延期 対日報復、エンタメに波及 [冬月記者★]
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- ウッドデッキで調子こいてたやついたじゃん
- 🦉エッホエッホ アンパンマンは猫舌って伝えなきゃ
- えんやすー
- 中国人「昔の仇を取る」「高市は狂ってる。制裁すればいい」「高市はことの重大さを認識してない」 [931948549]
