1 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 11:53:25.59 ID:ZPCfyTux.net] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part150 https://mevius.5ch.net/test/read.cgi/tech/1584975873/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1556142878/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) テンプレここまで
152 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 16:08:01 ID:HQ8vNkm/.net] setの重複排除条件をコントロールしたいだけなら std::(unordered_)setのPredテンプレート引数で制御すればいいだけの話じゃないの? からかって遊んでるだけ?
153 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 16:37:00 ID:zTMn2qwy.net] positionによる重複削除だけでなく、key1〜3によるソートと重複削除も必要だから 単純に順番にやるだけだと、余計な要素まで消えてしまう。 {{0,0},0,0,0},{{0,0},0,0,1},{{0,1},0,0,0} みたいなデータがあった場合、単純にpositionによる重複削除を先に実施してしまうと {{0,0},0,0,0},{{0,1},0,0,0} みたいになって、そこからkey1〜3によるソートと重複削除を行うと {{0,0},0,0,0} だけになってしまう。逆順でも同様の問題がある。
154 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 16:47:23 ID:HQ8vNkm/.net] その隠し要件どこに書いてるの?もしそれが必要なら横着せずに全部持っておくしかないね
155 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 17:24:57 ID:zTMn2qwy.net] 書いてるところはない。すまん。
156 名前:122 mailto:sage [2020/06/01(月) 08:41:58 ID:VTbJvOd1.net] すみません仕様間違えていました >positionによる重複削除だけでなく、key1〜3によるソートと重複削除も必要 ではなく positionによる重複削除だけでなく、key1〜3によるソートも必要 で、key1〜3が全部同じでもpositionが異なれば重複削除はしないという仕様が正しかったです なので >>148 さんが書いて下さったコードを追加して、 if(a->key1 != b->key1) return a->key1 > b->key1; if(a->key2 != b->key2) return a->key2 > b->key2; if(a->key3 != b->key3) return a->key3 > b->key3; return true;//ここをfalseではなくtrueに変更 にしたら、期待どおりの動作をしました 148さん本当にありがとうございます!とても助かりました 147さんもありがとうございます
157 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 08:53:47 ID:idPskxLG.net] >>154 > return true;//ここをfalseではなくtrueに変更 明らかに違反してるじゃねーの? https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering > 「狭義 (strict) 」 は非反射関係 (irreflexive relation) (全ての x について !comp(x,x) である)の要求
158 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 09:14:14 ID:VTbJvOd1.net] 難しい事はわかりませんが、 動作検証が足りてないかんじでしょうか もし駄目だったら、諦めて別の方法を考えようと思います
159 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 14:34:32 ID:o7IiynR8.net] double *array1; array1 = new double[count](); と書いた場合の、[count] の後ろの () の意味は何でしょうか? array1 = new double[count]; と書いた場合との違いは何でしょうか? ()の中に何か書くことは出来ますか?
160 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/06/01(月) 15:11:25 ID:0yVOdbpz.net] >>157 内容を初期化するかどうか。 普通のクラスでは括弧がなくてもデフォルトコンストラクタで初期化されるので 空の括弧があってもなくても意味はかわらないけど、 プリミティブな型などでは括弧無しのときは初期化しない。 (つまり内容は不定) 括弧があればゼロで初期化されることが保証される。 C++14 あたりからはこんな感じで初期化することもできるよ。 double *array1 = new double[]{1,2,3};
161 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 15:34:55.48 ID:o7IiynR8.net] >>158 をー。有難う。
162 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 18:12:14.25 ID:8BAaT/q7.net] 昔はよく{0}って書いてたというか書けなかったな
163 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 18:13:08.51 ID:8BAaT/q7.net] ×書けなかったな ○しか書けなかった
164 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 10:09:36 ID:d/ekt+66.net] ヘッダでvector要素の型を先行宣言で済ますことができるのc++20からだっけ?
165 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 11:21:52.93 ID:7ZgjbGq0.net] Working Draft, Standard for Programming Language C++ Document Number: N4713, Date: 2017-11-27 というPDFを読んでいるんだけど、explicitキーワードの事について調べようとしても、 索引(index)には載ってないようだけど、どこに書いてる?
166 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 12:04:07 ID:eZHppilZ.net] >>163 N4713だよね? P.1373の2行目は見た?
167 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 12:30:40.82 ID:7ZgjbGq0.net] >>164 Indexのspecifier項目のサブ項目として書いてあったんですね。 でもこれだとexplicitが何なのかを知りたい人にとっては索引としての役割を果たさないです。 いわば国語辞典で知らない単語を調べるのに勝手にカテゴリー分けしてあるようなものです。 それでは辞典の意味をなしません。
168 名前:はちみつ餃子 mailto:sage [2020/06/02(火) 12:34:14.97 ID:N0F889O8.net] >>165 PDF なのだから、ある項目について知りたければ検索すればいいよ。 この分量を印刷して読んでいるわけではないよね?
169 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 12:47:31 ID:67GQ09ou.net] 試しに検索かけたら1102件もヒットしたやんけ!餃子のバカバカ
170 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 13:55:05.15 ID:7ZgjbGq0.net] AdobeRederは使いにくいので、SumatraPDF Reader を使って、まず、 左側のペーンに出てくる目次で index をクリックし、右側のペーンに 巻末の索引を出した後、右側のペーンの中で CTRL+Fを押して、 explicitを検索すると良いよう。
171 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 14:01:01.31 ID:Ja+74ng6.net] 素直にありがとうも言えないのか これだからC++erは
172 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 14:11:59 ID:7ZgjbGq0.net] >>169 ありがとう。
173 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 14:58:48 ID:7ZgjbGq0.net] nested-name-specifier: :: type-name :: namespace-name :: decltype-specifier :: nested-name-specifier identifier :: nested-name-specifier template opt simple-template-id :: と有るのですが、このBNFだけで解釈するなら、ns1, ns2,ns3 という namespace が有った場合の ns1::ns2::ns3::変数名 のような場合、 namespace-nameと認識されるのは ns1だけで、ns2,ns3は、identifierと 識別されるのでしょうか。
174 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 15:00:52 ID:7ZgjbGq0.net] ちなみに、 namespace-name: identifier namespace-alias namespace-alias: identifier となっており、namespace-nameには、a::bb::cc のようなものは含まれないと思われます。
175 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/06/02(火) 15:16:37 ID:N0F889O8.net] >>167 索引だけ検索すればええんや。
176 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 16:38:50 ID:7ZgjbGq0.net] >>171 の定義だと、 decltype(x)::decltype(y)::decltype(z) のようなものは使えないということになるようです。 ひょっとすると、C++の仕様書的には、 ns1::ns2::ns3::変数名 も使えないのもかも知れませんがよく分かりません。
177 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 17:30:17.43 ID:cu23LxCqi] C++初心者がオセロを作ろうと思います。 外部設計でクラス図を作ろうとし、 調べましたがクラスとして抽出する単位に困っています。 クラスにするものと理由、または抽出する方法を教えていただけませんか。
178 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 17:48:50.88 ID:eZHppilZ.net] >>167 つーかよ、その1102件を末尾から順に見ていくとすぐなんだが そういう生活の知恵はあんまりないのかい?
179 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 19:53:34.27 ID:Ja+74ng6.net] よくわかんないけど ツイッターで誹謗中傷してそう
180 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 10:50:24 ID:TdRUmxlv.net] https://en.cppreference.com/w/cpp/utility/hash MyHash{}(obj) std::hash<S>{}(obj) の{}は、直接リスト初期化のもので、いったんMyHash型やstd::hash<S>型のテンポラリ・オブジェクトを作成してからoperator()関数をobjを実引数にして呼び出しているという理解でよろしいですか?
181 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 11:38:29 ID:Nfbl5e81.net] newしたあとにdeleteしなくてもアプリケーションを終了すればメモリは解放されますか?
182 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 11:58:33 ID:VI2pYiE8.net] OSによる
183 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 12:21:28.49 ID:TdRUmxlv.net] >>179 Windows/Mac/Linuxではメモリー領域自体は絶対に解放される。 ただし、deleteが呼び出されるわけではないので、原則的にはデストラクタは呼び出されない。
184 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 12:24:39.32 ID:DAHZjgl3.net] >>176 たまたまの結果を生活の知恵とかw キーワードと通常言語が被らない日本語万歳だな
185 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 12:28:15 ID:Nfbl5e81.net] >>180 >>181 ありがとうございます!
186 名前:はちみつ餃子 mailto:sage [2020/06/03(水) 13:34:40.56 ID:3vvIkHpN.net] >>179 プロセスに割り当てられているメモリは現代の普通のデスクトップOS上でならプロセスの終了と共に解放されるのだけど、 オブジェクトは外部のリソースのハンドルを掴んでいることがあるから それを正常に (デストラクタで) 後始末しないとリソースリークが起こる可能性はある。 POD 型のオブジェクトに限ってならば管理されてるリソースはメモリだけだから delete しなくてもプロセス終了時におおよそ安全に解放されることは期待していいと思う。 言語仕様での保証はないので C++ スレ的に言えば「やめとけ」ってことになるけど。
187 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 13:47:15.12 ID:gQ0mUfsI.net] メモリと断っている人に余計なこといわなくていいと思うけど アプリの異常終了であっても解放されてほしいのだろうから c++の終了処理に依存してもしゃない
188 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 14:24:00 ID:UHE1JPNz.net] >>182 何がたまたまの結果だよ C++規格票とドラフトは巻末に索引があって 検索でヒットしすぎるときは末尾を見に行けば そこは索引の中である可能性が大きいというのを 思いつくことができんのかおまえさんの頭では だから見つけられなくて聞いてきたというなら合点だ
189 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 14:27:27 ID:UHE1JPNz.net] >>179 世の中すべての::operator newの内容を確認してからでないと答えられない質問だ もっと言うなら将来にわたってタイムマシンで確認してくる必要があるから 調査の工数が発散しちまう どういう意味かわかるな?
190 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:04:54 ID:TdRUmxlv.net] https://qiita.com/SaitoAtsushi/items/8da8ae7f6b84b1d806e4 int main(){ double a = 1.5; std::string b = "Hello World"; struct foo{}; xyz(a, b, foo()); } ↑のfoo()は一時オブジェクトの作成ですね?
191 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:11:30.37 ID:DAHZjgl3.net] >>186 他人の茶々入れに何言ってんだよw
192 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:12:28.27 ID:DAHZjgl3.net] >>187 やはりこんな奴かwww
193 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:35:53.72 ID:TdRUmxlv.net] めちゃくちゃ難しいです。#100の部分は恐らく「部分特殊化」というものだと思うのですが、 自分がネットで調べた簡単な部分特殊化とはちょっと違っているようです。 https://ja.wikipedia.org/wiki/SFINAE // どのようなテンプレート引数であってもvoidになる template <typename... Ts> using void_t = void; template <typename T, typename = void> struct has_typedef_foobar : std::false_type {}; // #100 template <typename T> struct has_typedef_foobar<T, void_t<typename T::foobar>> : std::true_type {}; // T::foobarが存在すれば、こちらが有効になる struct foo { using foobar = float; }; int main() { std::cout << std::boolalpha; std::cout << has_typedef_foobar<int>::value << std::endl; std::cout << has_typedef_foobar<foo>::value << std::endl; }
194 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/06/03(水) 15:40:53 ID:3vvIkHpN.net] >>188 そういうのはコメントで質問すれば?
195 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:42:50.44 ID:UHE1JPNz.net] >>189 他人かどうかは関係ねえぜ 俺が生活の知恵と言ったことを たまたまの結果と言ったのはおまえさんに他ならない 必然的に思いつくまでの思考過程を示されて 自分の浅はかさを誤魔化すのに他人がどうのと 再び浅はかな言い訳で恥の上塗りするのは やめたほうがいいんじゃないかな
196 名前:デフォルトの名無しさん [2020/06/03(水) 15:44:00.45 ID:TdRUmxlv.net] >>191 部分特殊化とは、 template <typename T1, typename T2> class A {・・・}; //#1 として、「primary class template」を定義後、もし、 template <typename T> class A<T, void>{・・・}; //#2 と書いた場合、 A<int,int> なら、#1が、A<int>なら#2が適用されるということでしょうか? ならば、A<int,void>はどうなるんでしょう??
197 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:46:30.08 ID:DAHZjgl3.net] >>193 やはりこういうやつかwww
198 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:47:08.09 ID:UHE1JPNz.net] #2 つーか、そんくらいやってみろよ
199 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:47:50 ID:UHE1JPNz.net] >>195 やーい、同じことしか言わなくなってやんのw
200 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:49:26 ID:DAHZjgl3.net] 必ずしも索引があるとは限らないのにあることを一般論化してドヤ顔するのと ヒープ解放するかどうかはすべてを尽くして調べられないからわからたないとドヤ顔してる奴が 同じ人物だってのが困るわぁwwww
201 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:49:47 ID:DAHZjgl3.net] >>197 >>198
202 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 15:52:20 ID:TdRUmxlv.net] >>194 >>196 2017年のDraftのPDFには、以下のようにあり、部分特殊化をinstance化する際には、A<int>ではなく、A<int,int*> と書く例があります: Partial specialization declarations themselves are not found by name lookup. Rather, when the primary template name is used, any previously-declared partial specializations of the primary template are also considered. One consequence is that a using-declaration which refers to a class template does not restrict the set of partial specializations which may be found through the using-declaration. [Example: namespace N { template<class T1, class T2> class A { }; // primary template } using N::A; // refers to the primary template namespace N { template<class T> class A<T, T*> { }; // partial specialization } A<int,int*> a; // uses the partial specialization, which is found through the using-declaration // which refers to the primary template —end example ]
203 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:02:27 ID:UHE1JPNz.net] >>198 C++規格票とドラフトと言ったはずだ 必ずしも索引があるとは限らないとぬかすなら そうなっていないC++規格票とドラフトを例示しろ 事実無根の誹謗中傷はやめてもらおうか
204 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/06/03(水) 16:06:58 ID:3vvIkHpN.net] >>194 ほんとに >>196 の言う通りだわ。 やってみてから思った通りにならないのはなんでだろうっていうならまだしも 「どうなるんでしょうか」なんてやってみりゃわかることだろ。 まあ C++ には未定義とか処理系定義とかもあるから 実際の挙動を以て言語仕様を理解しようとするのは危険でもあるんだが……。 特殊化ってのはまさに「特殊な場合」を定義するもんだよ。 その場合には A<T1, T2> のテンプレートの特殊な場合として A<T, void> の場合を定義してることになる。 特殊な場合である A<T, void> は特殊でない場合の A<T1, T2> と同じ形式である必要がある。 >>200 基本的な理念が理解できていないのに仕様を読んでも理解できねーよ。 (まあたまには仕様からとっかかる超人もいないことはないが。) お前は Rust スレでも見当はずれの根拠をコピペしては意味不明なことを言ってるが、 普通に入門書を読んでくれ。
205 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:19:58 ID:H6kZ1pQy.net] イキイキしてんなwww
206 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:24:47 ID:DAHZjgl3.net] >>201 予想通りで乙w
207 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:25:39.34 ID:TdRUmxlv.net] >>202 結局、答えられないんですね。
208 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:29:44.75 ID:gQ0mUfsI.net] そこで煽ってどうするw
209 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:50:20.37 ID:UHE1JPNz.net] 質問しといて無礼な口の利き方をするやつにはお仕置きだ 一切何も教えない
210 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 16:50:59.31 ID:UHE1JPNz.net] >>204 ぐうの音も出ねえとは おまえさんのことだな
211 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 17:02:24.74 ID:TdRUmxlv.net] >>207 答えられないだけ。
212 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 17:03:53.52 ID:DAHZjgl3.net] >>208 都合よくげんていつけたりなくしたりwwww
213 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 17:04:33.42 ID:DAHZjgl3.net] >>207 なんでも上から目線 やはりこういうやつかwwww
214 名前:晒しage [2020/06/03(水) 17:11:10.63 ID:UHE1JPNz.net] 181 返信:デフォルトの名無しさん[sage] 投稿日:2020/06/03(水) 12:24:39.32 ID:DAHZjgl3 [1/9] >>176 たまたまの結果を生活の知恵とかw キーワードと通常言語が被らない日本語万歳だな
215 名前:sage [2020/06/03(水) 17:55:41 ID:B/1kftuN.net] getCFile()ってよくわからないので教えてください。 コードに次のような部分がありました。 getFile()では置き換えられない? /// \brief Get C-file. /// \return Extracted stdio's @c FILE structure. std::FILE * getCFile(); file_.getCFile()
216 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 18:46:53 ID:TdRUmxlv.net] >>194 推定だけど、 A<T, void> の場合、2番目の仮引数がvoid型になっているので、そこには実引数を 指定しないということになっているらしい。 その結果、A<1> みたいに1つだけの引数でtemplateをinstance化できる 様になっている気がする。 まだ仕様書で確認したわけではない。
217 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 18:53:53.18 ID:HVfXpWIv.net] いや、省略した場合のデフォルトを指定しない限り、そんなことにはならない template <typename T1,typename T2=void> class A; みたいにする まあ、primaryの定義と同時にも書けるし、そっちが普通
218 名前:はちみつ餃子 mailto:sage [2020/06/03(水) 19:02:53.85 ID:3vvIkHpN.net] >>205 俺が答えていることすら理解できてない模様。
219 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:07:42.01 ID:TdRUmxlv.net] [驚くべきパターンマッチング] MS製のSTLのforward()のソースを呼んでいて驚いた。 forward()の引数のremove_reference_t<_Ty>&& _Argの部分は、とても複雑なパターンマッチングをしているらしい。 _Tyがまだ決まって無い段階で、remove_reference<_Ty> というテンプレートclass を展開してtype メンバを調べ、それと実引数から右辺値参照部分を除いた部分を一致させるような複雑な処理をした結果、_Ty を逆算して決定しているらしい。 template <class _Ty> struct remove_reference { // YA, #1, primary class template。" using type = _Ty; // const も保存されているハズ。 using _Const_thru_ref_type = const _Ty; }; ・・・ remove_reference<> に対する部分特殊化があるが、省略 ・・・ template <class _Ty> using remove_reference_t = typename remove_reference<_Ty>::type; template <class _Ty> _NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call"); return static_cast<_Ty&&>(_Arg); }
220 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:08:51.14 ID:TdRUmxlv.net] >>216 仮に心の中にあってもあなたは全く言語化して無いないので駄目。
221 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:10:26.76 ID:TdRUmxlv.net] >>215 じゃあ、Wikipediaに載っていた>>191 の例はどう説明すれば良い? [] [ここ壊れてます]
223 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:14:50.42 ID:TdRUmxlv.net] >>219 そういえば仕様書に、templateをinstance化する際は、既に deducedされたパラメータは A<B>のBの中には書かないで良い例が書いてあった。 たとえば、 template <typename T1, typename T2>T1 f(T2 a); のような場合、 f<T1>(100); みたいにすれば、T2はint型だと分かるので、f<T1,int>(100)と書かなくて良いというもの。 それかな?
224 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:17:57 ID:TdRUmxlv.net] そうではなく、>>191 の場合は、primary template として、 template <typename T, typename = void> struct has_typedef_foobar : std::false_type {}; と、第二パラメータにデフォルト引数が書いてあるからか。
225 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:20:51 ID:HVfXpWIv.net] >>219 190ってまさにtypename=voidしている例じゃね
226 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:27:23 ID:TdRUmxlv.net] >>222 >>221 と入れ違いになった。 それで辻褄は合うけど、primary templage definition では、 template <typename T, typename = void> で、部分特殊化する際には、 template <typename T> としてあって、物凄い複雑だね。
227 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 19:48:21.19 ID:XMrfvYH7.net] TdRUmxlvは自分の日記帳に書いてくんないかな
228 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 20:15:01.97 ID:TdRUmxlv.net] 失礼しました。 でも断っておくと、俺ははちみつに対してそんなに悪口は言ってない。 スレの流れで混乱していたようだが、言っていたのは別人だから悪しからず。
229 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 22:21:05.04 ID:OT4MJN13.net] いちいちイラッとする書きっぷりはID:TdRUmxlvのコミュ力が絶望的に低くいだけなので許してあげてください
230 名前:デフォルトの名無しさん mailto:sage [2020/06/03(水) 23:25:41 ID:SSmphgFp.net] 憂さ晴らしに靖国に落書きしそう
231 名前:デフォルトの名無しさん mailto:sage [2020/06/04(Thu) 08:16:53 ID:85VTz4/e.net] とっくにNG
232 名前:デフォルトの名無しさん mailto:sage [2020/06/04(Thu) 13:15:35 ID:pT22FhoL.net] int& r_i=7; // compile error int&& rr_i=7; // OK 2行目は、どういう仕組みになってるんでしょう? 7という値がメモリー上にはどこにも存在して無い場合もあるはずで、 その場合でも右辺値参照を持てるものなのでしょうか? たとえばコンパイラの中に7という値は持っていても、アセンブラレベルでは、 どのsectionの中にも7というデータが入れられて無い場合もあると思うのです。 それだと7の入っている場所のアドレスは存在しえません。 例え「"右辺値"参照」であってもはアドレスが必要のはずですが。
233 名前:デフォルトの名無しさん mailto:sage [2020/06/04(Thu) 13:17:22 ID:+U2drwkO.net] 構ってはいけない
234 名前:デフォルトの名無しさん mailto:sage [2020/06/04(木) 14:43:12.11 ID:2rF1/e7a.net] >>229 言語規格的にはrr_iという名前を通じて7という値が取れれば何でもいい コンパイラが具体的にどうするかはコンパイラの勝手 アドレスがどこかで必要なら一時オブジェクトを作るようにするし必要なければ作らなくてもいい
235 名前:デフォルトの名無しさん mailto:sage [2020/06/04(Thu) 18:50:33 ID:pT22FhoL.net] >>231 どうやら、7の入ったint型の隠れた変数を一時オブジェクトとして作成してから、 そのアドレスをrr_iに入れているそうです。
236 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 01:50:09 ID:P1Z5Y5je.net] >>229 int& r_i=7; // compile error 確かにこれはダメ int&& rr_i=7; // OK int& rr_j = rr_i; // OK これおかしくね?
237 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 01:57:43 ID:loMZGJMS.net] &&嫌いだわ
238 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 03:20:06 ID:NFGxwtnl.net] 右辺値参照自身は左辺値定期
239 名前:はちみつ餃子 mailto:sage [2020/06/07(日) 09:08:16.75 ID:fhJ4vSsJ.net] だから std::forward が要るんだよ。
240 名前:デフォルトの名無しさん [2020/06/07(日) 11:40:26 ID:uPPavgXr.net] 昔のソースコードからの派生で開発する際、リソースの開放だけをデストラクタで行うように変えたいと考えています RAIIだけを行う標準的な実装って何かあったりしますか? あるいは、自分で調べた限りでは例えば、 HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); unique_ptr<void, decltype(&CloseHandle)> dummy(hFile, CloseHandle); // 以降dummyは使わずに生のhFileに対して操作 のようにunique_ptrを使えばできそうに見えますが、C++11以降の作法として正しいでしょうか?
241 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 13:44:00.54 ID:ocvuft6U.net] 作法とか正しいとかより自分で考えた方がいいと思うけど その場合あえて言えば、hFile渡すとこは 直接CreateFileの戻り値使って(hFileを宣言しない)、dummyの持つハンドル経由で使った方が 一貫性が取れていいかも 理想を言えば全部ラップした方がいいんだろうけど
242 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 13:55:18.98 ID:HzkE9Nko.net] >>237 その方法は始めてみた。 でも、unique_ptrなどを使わなくても、普通にC++98レベルのclassだけを使っても、RAIIは書ける。
243 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 14:54:05 ID:HzkE9Nko.net] >>239 RAIIというのは物凄く簡単に実装できて、細かいことを抜きにすれば以下の様にすれば完成する : class CMyX { protected: HANDLE m_hFile; public: CMyX(HANDLE hFile) {m_hFile=hFile;} ~CMyX() {CloseHandle(m_hFile);} } HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); CMyX myx(hFile); // これが初期化。後は勝手に hFileが解放される。
244 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 15:37:10.54 ID:NFGxwtnl.net] ポインタ以外のリソースでRAIIやらせるためのstd::unique_resourceが提案されてるけど難航してる リソースの種類や使い方でそれぞれ事情が違うから無理矢理一般化しても上手く行かないらしい
245 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 15:48:34.18 ID:HzkE9Nko.net] >>240 補足すると、このコードだとCreateFile()した後、返されたハンドル値を No CheckでCMyXのコンストラクタに渡しているが、本当はその前にINVALID_HANDLE_VALUEかどうかをチェックしておく必要がある。
246 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 21:39:58 ID:P1Z5Y5je.net] >>235 そこじゃなくて int& r_i=7; // compile error をエラーにする必要ある?ってこと リテラルを右辺値参照できんならエラーにする必要ないじゃん
247 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 21:49:43 ID:NFGxwtnl.net] それがエラーじゃなかったら右辺値参照は何のためにあるんだよ
248 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 21:56:24.65 ID:P1Z5Y5je.net] >>244 別にリテラル受けるためにあるわけじゃないでしょ 別の言い方すると int&& rr_i=7; // OK わざわざ一時オブジェクトつくってこれOKにする理由って何なの?
249 名前:デフォルトの名無しさん [2020/06/07(日) 22:22:50.71 ID:uPPavgXr.net] >>238 ,239,241 ありがとうございます >>240 はい、そうなんですけれど、こういったコードも省略したいということと、 頻繁に必要になるので標準ライブラリに入っていないかなって期待していたわけです >>241 なるほどstd::unique_resourceっていうので検討中なんですね これが標準に組み込まれるのを期待しておきます
250 名前:デフォルトの名無しさん mailto:sage [2020/06/07(日) 23:16:58 ID:+YSUT0gy.net] More Effective C++ の、 項目9 : リソースリークを防ぐためにデストラクタを使う 項目11 : デストラクタから発生した例外を抑える デストラクタ中で、例外がキャッチされない場合、 terminate を呼ばれて、受け身も取れず、強制終了させられる
251 名前:デフォルトの名無しさん mailto:sage [2020/06/08(月) 11:21:10.82 ID:KlUsfYw8.net] >>246 CreateFile以外にも似たようなのが沢山あって、それを楽にRAIIにしたいって話? ならすでにunique_resourceはあるらしいけど(experimentalだかどこかに あるいはそれに近い実装も公開されてるので落としてくればいいかと 逆にCreateFileだけなら素直に自分でクラス書いた方が後々楽になると思う
252 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/06/08(月) 12:33:58 ID:KAmnJXdU.net] リソースの解放以外は生のハンドルが使いたいという前提だと、 「unique_resource で包まれたオブジェクトからハンドル使うたびに (get で) 取り出す」という操作が必要になる。 たぶん >>237 の書きようだとそういうことはしたくないんだろうし、 包む前のハンドル (が入った変数) をそのまま使うとなると折角の所有権管理が台無しだ。 unique_resource はリソースの所有権管理の仕組みであって、 デストラクタでリソース解放もするのは所有権管理に付随するものに過ぎない。 どちらかというと scope_exit の方がやりたいことに近そうな気がする。 けど、いずれにしても中途半端なんだよな。 現時点でリソースの解放 (CloseHandle) がちゃんとできているなら それを unique_resource (なり scope_exit なり) に置き換える意味はあまりないんじゃなかろうか。 「CloseHandle の書き漏らし」ってのと「scope_exit の書き忘れ」 ってのは同程度に有り得ることで、そんなに良くならないと思うよ。 型としての HANDLE の実態は void* なので、 HANDLE を HANDLE として扱おうとする限り C++ の型システムの恩恵はあまり受けられない。 古いコードをなるべくいじらずに使いたいという理由はとてもよくわかるのだけれど、 半端な書き換えをするくらいなら抽象レイヤをきちんと構築した方が結局は楽だと思う。