- 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
- 716 名前:デフォルトの名無しさん mailto:sage [2025/10/01(水) 06:54:56.10 ID:O1Ml42XO0.net]
- >>715
そう、2の場合でもTParent::get_sizeはあるけど<T>とはマッチしない場合にはちゃんと1と同じ挙動になるんだよね TParentにstaticなget_sizeが全くない場合だと1と2で挙動が変わってしまう でも2って1をインラインに直接書いたものであって同じ意味だよね? だからrequiresがどういう意味を持つかとか以前に挙動変わってくる時点で不可思議なんだよね
- 717 名前:はちみつ餃子 mailto:sage [2025/10/01(水) 07:43:33.30 ID:XKqCU3PC0.net]
- >>716
1 の場合は get_size は依存名だ。 そこで解釈が違うよ。
- 718 名前:デフォルトの名無しさん [2025/10/22(水) 12:58:32.68 ID:6nuMV8zc0.net]
- C++26から入るらしい^^と[::]という二つの演算子はどういう用途に使うものなのでしょうか?
- 719 名前:はちみつ餃子 mailto:sage [2025/10/22(水) 13:31:13.53 ID:/iXiQCcE0.net]
- >>718
リフレクションで検索したら色々な例がみつかるよ。 構文要素を値として取り扱う、本物のマクロだ。
- 720 名前:デフォルトの名無しさん mailto:sage [2025/10/22(水) 19:35:11.69 ID:t2Chdy11a.net]
- ^^
↑ちょっと顔にみえる
- 721 名前:デフォルトの名無しさん [2025/10/22(水) 21:43:50.71 ID:q+0a8lK20.net]
- ^^;
- 722 名前:デフォルトの名無しさん mailto:sage [2025/10/22(水) 21:55:39.76 ID:tW3LNod+a.net]
- ^^;ゞ
- 723 名前:デフォルトの名無しさん mailto:sage [2025/10/22(水) 22:05:42.67 ID:b6F/3uj70.net]
- ^^::←グローバル名前空間のリフレクション値
- 724 名前:デフォルトの名無しさん mailto:sage [2025/10/23(木) 05:29:13.93 ID:HOQCmR4+0.net]
- v^^
- 725 名前:デフォルトの名無しさん [2025/10/23(木) 21:41:47.99 ID:FPW1mHao0.net]
- 山崎渉
- 726 名前:デフォルトの名無しさん [2025/10/24(金) 14:17:57.63 ID:nAYKU6CIa.net]
- GGは
へへ ミミ
- 727 名前:デフォルトの名無しさん [2025/10/29(水) 17:48:11.20 ID:KY7jGttbH.net]
- Y(^_^)Y なんすかこれ
口が違う。覚えてる人修正して
- 728 名前:デフォルトの名無しさん [2025/11/11(火) 14:16:42.56 ID:crDtfQHZa.net]
- バルタン星人のひと元気かな
- 729 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 14:20:45.09 ID:jo2+4JNJM.net]
- 多分基本的な質問ですまんけど、参照型のメンバー持ったクラスをmove対応させるのってどうやんのが定石?
ポインタにするしかない?
- 730 名前:はちみつ餃子 mailto:sage [2025/11/13(木) 14:53:55.31 ID:bJCWdXAy0.net]
- >>729
その参照が差す先のオブジェクトの所有権 (最終的に後始末する責任) を持っている状況ということ? ポインタを交換する手法がよく使われるのはヌルで無効を表現してるだけなので所有権を持ってるかどうかわかるフラグを立てれるならなんでもいいよ。 型システム的に表現するなら optional と reference_wrapper を組み合わせるのがよいかな。(optional は参照を直接には保持できない。)
- 731 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 22:00:10.45 ID:oKSfQs8Q0.net]
- いきなりわからんorz
- 732 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 22:38:55.22 ID:PBCTneT3M.net]
- >>730
なるほどサンキュー でもoptionは省きたいところ moveしたあとは使わない前提でこれはUBになる? class A { std::reference_wrapper<const std::string> m_s; public: A(const std::string& s) : m_s(s) {} A(A&& rhs) : m_s(std::exchange(rhs.m_s, *(const std::string*)nullptr)) { } };
- 733 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 22:48:43.43 ID:qvmNyT2p0.net]
- ・T*(ナマポ)にする
Pros: 一番素直、ムーブ後状態をぬるぽで自然に表現できる。 Cons: メンバ使ってるとこで*付けたり.を->に書き換えたりが必要。deleteとか加減算とか好き勝手できちゃう。今どきナマポとかダサい。 ・std::unique_ptr<T>やstd::shared_ptr<T>にする Cons: 多分セマンティクス違う(もともとはヨソのオブジェクト覗いてるだけでしょ?) ・std::referrence_wrapper<T>にする Pros: 参照の置き換えという意味でこれも素直。 Cons: メンバ使ってるとこに.get()をつける書き換えが必要。ムーブがコピーになるので抜け殻に参照が残って潔癖な人だとキショい。 ・std::optional<std::referrence_wrapper<T>>にする Pros: 型的に一番真面目なので型マニアにっこり。 Cons: 書くのめんどい。「何これ?」って聞かれたときに説明めんどい(未来の自分含む)。.get()必要。 ・メンバはT&のままにしてムーブコンストラクタとムーブop=の方で対応する Pros: 既に使われてる所の書き換え不要。 Cons: ムーブ関数書くのとメンテし続けるのがめんどい。抜け殻に参照先残る。 どれも完璧じゃないから好きなの選んでいいよ
- 734 名前:デフォルトの名無しさん [2025/11/13(木) 23:01:27.30 ID:/tchf03X0.net]
- unique_ptrと同様のもの(unique_ref)を作ればいいんじゃねえのって話だろ
ただしptrはnullptrで無効を表現してるから 代わりにフラグを用意する class unique_ref{ T& ref;//参照 bool isValid;//無効判定 //コンストラクタ unique_ref(T&r):ref(r), isValid(true){} //ムーブ コンストラクタ unique_ref(unique_ref&& a){move(a);} //ムーブ代入 unique_ref& operator=(unique_ref&& a){move(a);} move(unique_ref&&a){if(this!=&a && a.isValid) ref=a.ref; a.isValid=false;} } てなかんじかと 知らんけど
- 735 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 23:06:32.01 ID:pKRh1I850.net]
- 参照なんて引数と演算子オーバーロード以外で使ってもいいこと無くね?
- 736 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 23:07:03.58 ID:qvmNyT2p0.net]
- そもそも所有権自分で保持してるメンバがもともとT&ってことはないだろ
どっか遠くのオブジェクトを見えるようにしてるだけでしょ? (それはそれで設計的に焦げ臭いけど置いとく)
- 737 名前:デフォルトの名無しさん [2025/11/13(木) 23:07:46.30 ID:/tchf03X0.net]
- もしくはunique_ptrをunique_refでラップしてしまうのが楽か
- 738 名前:デフォルトの名無しさん [2025/11/13(木) 23:10:58.33 ID:/tchf03X0.net]
- >>736
たまにある 外部リソース(たとえばファイルハンドル)を一時的にクラスに保持して使いやすくするとか なんにせよ寿命を明示的に管理しておかないと後でやばいことになる
- 739 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 23:14:39.55 ID:qvmNyT2p0.net]
- >>738
ファイルハンドルだとして、それを管理するクラスがファイルハンドルの値自体を持たずにヨソに置いて参照するのはなぜ? やっぱり意味がわからない
- 740 名前:はちみつ餃子 mailto:sage [2025/11/13(木) 23:20:38.76 ID:bJCWdXAy0.net]
- >>732
UB になる。 ポインタと違って参照自体は無効を表現できないのが C++ の基本ルールであり、 reference_wrapper でもそれは同じ。 それでもあえてやるなら適当にダミーのオブジェクトを作っておいてそれを参照していたら無効ということにするというようなことをできなくはないが……それはそれでちょっと不恰好だよね。
- 741 名前:デフォルトの名無しさん [2025/11/13(木) 23:22:41.52 ID:/tchf03X0.net]
- >>739
クラス内部でちゃんと管理するのがいいんだけど時には関数内クラスを定義してちょっとしたことを行うこともある(かも) その時には所有権を一時的にでも委譲しなきゃならなくなる
- 742 名前:デフォルトの名無しさん mailto:sage [2025/11/13(木) 23:30:06.73 ID:qvmNyT2p0.net]
- >>741
ハンドルは外部で持ったままで、その関数内クラスにはハンドルの参照を渡す(関数内クラスの参照メンバを外部のハンドルで初期化する)って言ってる?それ委譲とは言わないよ 委譲したからにはそのリソースはその関数内クラスの消滅とともに消えないといけないけど、そうなったら外部で持ってたハンドルの実体はどうなるの? どんなケースを想定してるのか全然わかんない
- 743 名前:デフォルトの名無しさん mailto:sage [2025/11/14(金) 12:19:28.56 ID:YW3kWFexM.net]
- >>740
までもnull objectはよく使ってるからそれにするわ 個人的にはすっきり でもc++の参照っていらん子やん?って気がしてならない class A { static constexpr std::string s_empty_str{""}; std::reference_wrapper<const std::string> m_s; public: A(const std::string& s) : m_s(s) {} A(A&& rhs) : m_s(std::exchange(rhs.m_s, s_empty_str)) { } };
- 744 名前:デフォルトの名無しさん [2025/11/14(金) 17:06:33.25 ID:sw2A38eb0.net]
- >>743
型無しのnullpointerが型システム(機能保証)を破壊しているから、型を強要する参照は必要。
- 745 名前:デフォルトの名無しさん mailto:sage [2025/11/14(金) 17:48:56.23 ID:d/VpWy+aM.net]
- >>744
古くね? そういうのはoptional使えってのが最近のやり方でしょ?
- 746 名前:はちみつ餃子 mailto:sage [2025/11/14(金) 19:18:46.50 ID:YeCIJNF30.net]
- >>743
参照は色々な場面で有用ではあるが、 D&E によれば最初の動機は演算子オーバーロードだと書かれている。 オブジェクトをコピーする必要がない (値をコピーせずに場所を渡せば充分) ような状況で参照がなくポインタを使うならいちいち &a+&b みたいにして書く必要が生じる。 いかにも煩わしいだろう。
- 747 名前:デフォルトの名無しさん mailto:sage [2025/11/14(金) 19:55:59.90 ID:p/1JbX4j0.net]
- C++より古いの新しいの含めて多くの言語が採用してるように参照は引数でのみ使用可能で良かったと思うよ
- 748 名前:デフォルトの名無しさん [2025/11/14(金) 20:35:30.63 ID:/xnnTPah0.net]
- >>747
他の言語はともかく、C++の参照は引数に限定されてないですよ。 int a = 10; int* pa = &a;
- 749 名前:デフォルトの名無しさん [2025/11/15(土) 10:22:10.37 ID:ncudN0/g0.net]
- 747は、(実際の仕様はそうなっていないけど)引数でのみ使用可能なら良かったのに……という意味だと思うぞ。
- 750 名前:デフォルトの名無しさん [2025/11/15(土) 19:11:12.30 ID:lfrbAWbT0.net]
- ああ
>使用可能で良かったと思うよ ではなく、 >使用可能だったら良かったのにと思うよ って事ですか
- 751 名前:デフォルトの名無しさん mailto:sage [2025/11/15(土) 19:25:57.81 ID:3JdS/6Ib0.net]
- カスみたいな読解力
- 752 名前:デフォルトの名無しさん mailto:sage [2025/11/15(土) 19:35:13.09 ID:QqRirP4Fr.net]
- そんなコミュ力高かったら、石が友達なんて言わない
- 753 名前:デフォルトの名無しさん [2025/11/15(土) 19:39:44.33 ID:ncudN0/g0.net]
- 分かりやすいように749みたいに書いたけど、747で普通に意味が通じるので、「ではなく」というとちょっと違う気がするかな。言葉って難しい。
- 754 名前:デフォルトの名無しさん mailto:sage [2025/11/16(日) 01:00:07.67 ID:oagsDxeg0.net]
- こういう人が仕様書読んで実装すると思うとこわい
- 755 名前:デフォルトの名無しさん [2025/11/16(日) 13:18:16.47 ID:0LN83zrSa.net]
- 横からだけど
>>747 で充分判る >>748 は本当に日本人か?
- 756 名前:デフォルトの名無しさん mailto:sage [2025/11/16(日) 13:32:50.84 ID:Xh/GBEYv0.net]
- C++ばっかりやっとるからだよ
日本語を使え
- 757 名前:デフォルトの名無しさん [2025/11/16(日) 16:38:31.73 ID:r6khXsKc0.net]
- >>755
>748だけど日本人だよ。 >747日本語の文法としておかしいと思うんだが分かるんか…。 こっちが年食ったんかなぁ…。
- 758 名前:デフォルトの名無しさん mailto:sage [2025/11/16(日) 16:49:19.65 ID:D8AV/AUw0.net]
- あんたは機能的非識字なんでしょ
歳とか関係ないって
- 759 名前:デフォルトの名無しさん [2025/11/16(日) 18:20:15.84 ID:fnmgx6dT0.net]
- 747は、日本語の文法としておかしなところは別にないけれども、748のような読み方も許すという点で多義的な文にはなっているかな。
「C++より〜ように」という前半の文脈があるので748のような受け取り方はしない方が普通だと思うが、文法的には748のような読み方も一応可能だろう。 「使用可能(ということ)で良かった」としたら、完全に一義的になっているとまでは言えないまでも、多少ニュアンスは明確になっているかな。そうでもないか。
- 760 名前:デフォルトの名無しさん mailto:sage [2025/11/16(日) 19:06:28.66 ID:B8gkzotY0.net]
- >>757
文字なんでニュアンスが伝わりづらいだけだよ 「この前の件だけど、両方出来るようになったよ」 「他と同じように片方のみで良かったと思うよ」 まあ誤解を与えない書き方とすると 「他と同じように片方のみで良かったのにと思うよ」 って感じで「のに」をいれた方が残念がっている様子が伝わってくるよね
- 761 名前:デフォルトの名無しさん [2025/11/17(月) 09:06:44.31 ID:g7E0m0EQ0.net]
- C++はよく分からないので、cpprefjpにはいつもお世話になっているんだけど、生文字列リテラルのところにある「改行が入力された場合、改行の制御文字 '\n' に変換される」というのは説明として正確なのかな。
raw文字列リテラルのところの規格にはそれっぽいことは書いていないように思うし、改行文字は通常の文字としてそのままraw文字列リテラルに含められるだけであって、別に「変換」とかはされていないんじゃないかと思うんだけど。
- 762 名前:はちみつ餃子 mailto:sage [2025/11/17(月) 10:18:46.23 ID:DdlSQj440.net]
- >>761
'\n' に変換するという説明は誤りだと私も思う。 規格内の例中では \n と同等というような説明はあるのでこれを変換と誤解したのかも? https://timsong-cpp.github.io/cppwp/n4950/lex.string#5
- 763 名前:はちみつ餃子 mailto:sage [2025/11/17(月) 10:27:40.74 ID:DdlSQj440.net]
- 余談だけど生文字列リテラルの扱いにはちょっと変な特別扱いがある。
C++ では処理の初期段階で行を連結 (改行を削除) してしまうことになっていて、その時点では各改行が生文字列リテラルの中なのかどうか認識してない。 https://timsong-cpp.github.io/cppwp/n4950/lex#phases-1.2 後でトークンを分割するときになって生文字列リテラルを認識したらその範囲では連結を「取り消す」という処理が入る。 https://timsong-cpp.github.io/cppwp/n4950/lex#pptoken-3.1 結果としては改行はそのまま含まれるだけなんだけど、理屈としては色々な操作 (変換?) はされてる。 ただ、これは C++ の言語の解釈の話であって処理系の実装方法ではない。 つまり結果が同じであれば実装方法は問わないので連結してから取り消すのではなく連結の例外にしてもかまわないし、 生文字列リテラルを普通の文字列リテラルに変換するような手法もあるのかもしれない。
- 764 名前:デフォルトの名無しさん mailto:sage [2025/11/17(月) 20:16:57.16 ID:3c799E+W0.net]
- >>761
gccにCRLF改行のソースコードを食わせてもLF(\n)だけになったので変換はされてるんじゃないか 他のコンパイラの動作はしらね
- 765 名前:デフォルトの名無しさん [2025/11/18(火) 02:43:23.41 ID:oTdu6LNz0.net]
- >>763
削除されるのは「\(改行)」(Pythonとかでは明示的な行継続と言われているやつ)みたいなやつだけで、(\ に後続しない)単なる改行はwhitespace文字として扱われるだけかと思っていたんだけど。 >>764 改行をLFだけにする(正規化?)のは、raw文字列リテラルに限らない共通の処理なのでは。
- 766 名前:デフォルトの名無しさん mailto:sage [2025/11/18(火) 07:15:20.89 ID:cPKOUaFd0.net]
- 規格が決めてるのはソース中の論理的な「改行」の振る舞いであって、そのバイト表現は知ったこっちゃないって奴じゃないの
知らんけど
- 767 名前:はちみつ餃子 mailto:sage [2025/11/18(火) 10:05:52.54 ID:BySuHnsX0.net]
- >>766
従来はそうだったはずだけど C++23 からは Unicode (UTF-8) のコードポイントの並びで規定されていて、 CRLF が単一の改行に置き換えられる規則が明記されてる。 ただ、 Unicode 系以外の文字コードから処理系定義の規則で Unicode に適当にマッピングするようなのも認めているので実態はあまり変わらない。
- 768 名前:デフォルトの名無しさん [2025/11/18(火) 23:53:18.65 ID:+AochNn2a.net]
- >>764-765
termcapだかterminfoだかでゴニョゴニョ
- 769 名前:デフォルトの名無しさん mailto:sage [2025/11/19(水) 15:04:12.19 ID:HRoC/CWNM.net]
- >>768
関係ない
|

|