[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/26 03:13 / Filesize : 247 KB / Number-of Response : 1023
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part146



1 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 11:35:36.76 ID:4wggfTwe.net]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part145
mevius.5ch.net/test/read.cgi/tech/1568362404/

このスレもよろしくね。
【初心者歓迎】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/ (日本語)

685 名前:デフォルトの名無しさん mailto:sage [2019/12/06(金) 16:13:34 ID:zfbHpqVT.net]
>>671
おい、真面目に情報提供している者に対してパープリンとは何だ
俺だけじゃなく640もパープリン呼ばわりか

後出しという自分の落ち度を棚に上げて
そういう発言は5chのフランクさでは済まんぞ

686 名前:デフォルトの名無しさん mailto:sage [2019/12/06(金) 16:14:35 ID:hYHuFzfT.net]
初手人格否定はC++erのセオリー

687 名前:デフォルトの名無しさん mailto:sage [2019/12/06(金) 16:14:40 ID:jImJStBO.net]
>>671
お前が生きてる価値の無いゴミなだけ

688 名前:デフォルトの名無しさん mailto:sage [2019/12/06(金) 16:39:35.59 ID:qwyC8IXX.net]
>>661もたいがい無意味に煽ってる書き込みだと思うがw

689 名前:デフォルトの名無しさん [2019/12/06(金) 17:15:36 ID:hyokDgJv.net]
https://news.livedoor.com/article/detail/17486025/

690 名前:デフォルトの名無しさん mailto:sage [2019/12/06(金) 18:34:35 ID:PPEOwhLk.net]
>>671
OpenMP & SIMD intrinsics

691 名前:デフォルトの名無しさん mailto:sage [2019/12/06(金) 19:25:13.77 ID:3oohkeAj.net]
lock_guard使わずになに使うの?

692 名前:デフォルトの名無しさん [2019/12/06(金) 19:35:24.69 ID:3J8eqh7h.net]
ひのきのぼう と かわのふく

693 名前:デフォルトの名無しさん [2019/12/06(金) 22:24:12.87 ID:hyokDgJv.net]
ヒノキの棒でぶっ叩けば人は死ぬし、皮の服は火焔や刃物を弾く。
どちらかというと上級者向けの装備だと思います。



694 名前:デフォルトの名無しさん [2019/12/06(金) 23:38:17.10 ID:pm/DYA/c.net]
operator[]で読み書きって毎回調べないとできず
set()、val()とか関数で読み書きしてすますことが多いのだが
新文法などで簡単にやる方法わかりますか

695 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 01:06:30 ID:5MyaotCE.net]
なにいうとるのかわからん
operator[]をどう実装してどこで使えばいいのか理解できてないという話なのか

696 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 01:08:17 .net]
>>615
余再帰だな
江添やっちまったなあ!

697 名前:デフォルトの名無しさん [2019/12/07(土) 01:59:52 ID:4p8EX4B8.net]
>>682
ふつうの実装では、A[n]は参照しかできず
A[n] = の代入ができないという事

698 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 05:36:21.30 ID:UnIspDfI.net]
>>684
「参照」を返せばいいだけだが、そういうことではない?
まさか「参照」を知らないと言うわけではないよね。

699 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 06:10:47.12 .net]
ちょくちょく初心者質問スレに行った方が良い人までここに堂々と書き込むのが
スレを妙な雰囲気にしてる

700 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 06:56:32.11 ID:C/SdN+6e.net]
>>615 >>683
「余再帰」 corecursion って呼ぶのか。勉強になるわ。

江添さんのページを見てみたんだけど、
「このコードは末尾再帰になっている。」の行の前に
最初の return n * factorial(n-1) を返す関数を
末尾再帰に書き換えたコードの引用があるべきなのを
挿入し忘れたように思えるね。

・末尾再帰でないコード例を示す
・末尾再帰にするとこうなる ... コード欠落
・末尾再帰はループに書き換えられるよ
・ループにしたコード例
っていう流れで自然に読めるでしょ。

701 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 09:42:39 ID:fV2E4bDP.net]
でもこのシグネチャのfactorialのままだと末尾再帰できなくね?>>642みたいになるかと。

702 名前:デフォルトの名無しさん [2019/12/07(土) 11:49:45.97 ID:4p8EX4B8.net]
>>685
たとえばbitsetを実装しようして、内部では32や64bitの整数へ保存するとして
参照だけではB[i]=1はできないかと

703 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 11:56:48.08 ID:vGCb4aWc.net]
最初からそうかけよ



704 名前:デフォルトの名無しさん [2019/12/07(土) 11:57:37.74 ID:4p8EX4B8.net]
これのこと、毎回調べ直さないと作れない


プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。

利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。

このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。

ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。

まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。

こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html

705 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:00:39.08 ID:vGCb4aWc.net]
相談じゃないなら他へ

706 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:02:24.40 ID:U9XnFfRh.net]
プロパティはコード上でフィールドのように扱えることよりもメンバとしてIDEが認識できるところに意味がある
最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている
初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな

707 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:11:07.35 ID:JfALL9r7.net]
proxyで別に実行効率は下がらんよね
てかstd::vector<bool>は大昔から存在するし

708 名前:デフォルトの名無しさん [2019/12/07(土) 12:25:43.42 ID:cPeMBqq7.net]
C++Builder使えばよいのでは。

709 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:42:26.89 ID:JVuyt12v.net]
>>684, >>684
他言語での getter/setter メソッド的な事をやりたいのだろうなあと考えてみました。

例えば a[i] と書かれたら、 内部データ(typename T) への参照(T&) を返すのではなく
新たに内部クラス(fields: owner, index)を用意して、そのオブジェクトを作って返すようにします。
これに代入演算子(operator =) と キャスト演算子(operator T()) を実装すれば...
・a[7] = 99; //setter
・cout << a[7]; //getter
こうやって普通にアクセスできます。メソッドを分離したお陰で、
添え字アクセスによるデータベースのupdate / select みたいな事が可能になります。

代入演算子は最低二種類必要で
Inner& operator =(const T& value); // a[i] = value
Inner& operator =(const Inner& rhs); // a[i] = a[j]
二つ目を実装しないと暗黙のコピー代入演算子が作られてしまい
a[i] = a[j]; のような代入操作は実質空文化します。(owner/indexがコピーされるだけ )

素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。

710 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:55:02.34 ID:vGCb4aWc.net]
意味の無い所で無駄にコードサイズを増やさなくても
普通にset/get関数で良いよ

711 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:20:15 ID:euj2mOhA.net]
setterの戻り値はvoid?this参照?

712 名前:デフォルトの名無しさん [2019/12/07(土) 13:22:21 ID:cPeMBqq7.net]
bitsetは参照返すからset(1).set(2).set(10)などと連鎖できる。

713 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:35:21 ID:QAzyzpfC.net]
>>672

なんだてめえパープリンの活け造りが
ぶち殺すぞ低脳野郎

ぶち殺し行ってやるから住所さらせや糞野郎



714 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:36:49 ID:hSwO/YRY.net]
これがC++er流の挨拶です

715 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:37:29 ID:QAzyzpfC.net]
>>672
真面目に糞情報しか提供できない出来損ないならすっこんでろウスノロ
とにかくぶち殺しに行ってやるから住所晒せや

716 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:38:45 ID:QAzyzpfC.net]
>>678
今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww

717 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:44:27 ID:QAzyzpfC.net]
パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT



出てこい知障

718 名前:デフォルトの名無しさん [2019/12/07(土) 13:49:37 ID:cPeMBqq7.net]
そもそも10を代入して値が10にならないなら、意味的に組み込み型の整数とは違うのかもしれない。
整数ではないものを整数で代用したときに起きる問題なのかも。

719 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 14:40:05 ID:gqZSFnI2.net]
効いてる効いてるw
弱い犬ほどよく吠えるねえ

720 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 15:57:37 ID:kC4yD5gf.net]
>>683
江添なんて前からそんなもんだぞ。
人の間違いには厳しいが自分の間違いには逆ギレするような男だ。

721 名前:デフォルトの名無しさん [2019/12/07(土) 15:59:46 ID:cPeMBqq7.net]
clang-cl結構いいね。

722 名前:デフォルトの名無しさん [2019/12/07(土) 16:00:40 ID:cPeMBqq7.net]
>>707
全方面に厳しいって事?
自分にも他人にも。

723 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 16:33:39.12 ID:C/SdN+6e.net]
「自分の間違い(に対する指摘)には逆ギレ」ってことでしょな。

書籍として印刷・発売する前にネット公開して広く意見を求める、
「お前らタダで読ませてやるから品質向上に協力しろや」方式と考えれば
誰にも損のないやり方だと思うけどね。
少なくとも俺にとってはありがたい。



724 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 17:24:58.21 ID:ZsYnLuoj.net]
意見を反映させる能力があればな。

725 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 17:31:56.94 ID:xzwyWWlr.net]
https://github.com/EzoeRyou/cpp-intro/issues

726 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 20:57:58.81 ID:KRZcErEE.net]
なんかうちのVisual Studioだと
iscntrl('\t')
が非0(真)になるんだけど
これって正しい?

727 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 21:22:47.02 ID:F8+HNqgO.net]
表示できる文字と空白以外は全部制御文字だね

728 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 22:13:42.05 ID:KRZcErEE.net]
isspace('\t')は非0(真)なので'\t'は空白のはずェ、

つかGoogle Testにかけたらこうじゃわ↓↓↓
TEST(stdlibTest, ctype) {
ASSERT_FALSE(isspace('\0'));
ASSERT_TRUE(isspace('\n'));
ASSERT_TRUE(isspace('\r'));
ASSERT_TRUE(isspace('\t'));
ASSERT_TRUE(isspace(' '));

ASSERT_TRUE(iscntrl('\0'));
ASSERT_TRUE(iscntrl('\n'));
ASSERT_TRUE(iscntrl('\r'));
ASSERT_TRUE(iscntrl('\t'));
ASSERT_FALSE(iscntrl(' '));
}

729 名前:デフォルトの名無しさん [2019/12/07(土) 23:02:18.90 ID:cPeMBqq7.net]
盲目の為のロケールがあったら、ベル以外全部制御文字になるんだろか。

730 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 23:12:25.74 ID:fV2E4bDP.net]
0x00から0x1fまでは全部制御文字で違和感ないけど。

731 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 23:19:02.06 ID:EVNez7Da.net]
printableってのは音声出力も含むのではなかろうか

732 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 02:49:31 ID:C6vow3qq.net]
盲人のブログラマーって普通にいるんだな
なんかかっけーな

733 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 08:37:40.25 ID:9eRqVWoa.net]
Visual Studio 16.4オンラインアプデしたら
それまで使ってたParallel Studio2019 U5使えなくなった。
Visual C++でコンパイルできるがIntel Compilerはコンパイル失敗してしまう
それと、
プロジェクトのプロパティからIntel Compilerは選択できるんだが、
プルダウンメニューからIntel Compilerを選択できないようになった。
Parallel Studio最インスコしてもコンパイルは失敗する。2019 U5 が16.4に対応してないとかないよね?



734 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 08:39:40.14 ID:drue7Jpy.net]
>>713
例によってロケール依存らしいが "C" だと
iscntrl() が真を返す値は 0x00-0x1f, 0x7f みたいね。
これまた例によって unsigned char 範囲と EOF 以外の値については未定義。

つうか、このくらいは5ちゃんねる以外から情報を探す方が
早くて確実じゃないかしら。

735 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 13:11:02.08 ID:hM3Qn2JU.net]
C++で作ったブラウザテニスゲーム(PWA仮対応):
https://yutakaaoki.github.io/demo_tennis/
Wasm+PWA+WebGL+"C++"

736 名前:デフォルトの名無しさん [2019/12/08(日) 14:09:36.54 ID:3pi+cAN/.net]
>>722
青木さんは何をしようとしてるんですか?

737 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 14:17:37.03 ID:vN1dzuVf.net]
>>722
で、質問は?

738 名前:デフォルトの名無しさん [2019/12/08(日) 14:36:36.30 ID:3pi+cAN/.net]
もっと早くは最速って意味ですか?
それとも速くしたいって意味ですか?

739 名前:デフォルトの名無しさん [2019/12/08(日) 14:56:59.55 ID:3pi+cAN/.net]
インテリコード、ほんとに提案してくるね。
お前は次にこう書く・・・って。

740 名前:デフォルトの名無しさん [2019/12/08(日) 15:02:14.03 ID:J+6Nu+8f.net]
歯垢の妨げにしかならんわ

741 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:09:58.86 ID:hM3Qn2JU.net]
>>723
C++ Nex という言語とそのIDEを作ってますが、マルチプラットフォームの
ツールキットも同時に作ってます。MacやiOSなどまで native 対応するのは
貧乏なので機材の関係で難しいので、wasm に対応することでひとまずは
凌ごうかと思いました。

ツールキットのソースをBSD/MIT系ライセンスで公開して、C++ Nex も
無料で使えることにして、みなさんのお力をお借りして native対応の
ツールキットに出来ればいいのですが。ひとまず、Windows/Wasm/Android
くらいまでなら対応できる目処は立ってます。iOSについては、swift
言語が出したオブジェクトファイルとリンクすることはWindows上でも
実験できそうなので、その基礎的な部分だけならMakefileなどの開発環境を
用意することはできそうです。

Mac miniがあれば、iOS native 対応も出来そうなんですが。

742 名前:デフォルトの名無しさん [2019/12/08(日) 17:29:31.80 ID:3pi+cAN/.net]
基本的にネイティブ志向なんですね。

743 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:29:36.52 ID:oOCB7Yl8.net]
>>728
ソースコード見せて



744 名前:デフォルトの名無しさん [2019/12/08(日) 17:30:50.90 ID:3pi+cAN/.net]
ウェブアセンブラは興味あるんだけど、イマイチ情報が。

745 名前:デフォルトの名無しさん [2019/12/08(日) 17:32:13.08 ID:3pi+cAN/.net]
高橋茉奈著やさしいウェブアセンブラが待たれる今日この頃。

746 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:37:23.93 ID:hM3Qn2JU.net]
>>730
ライセンスは、BSD, MIT, LGPL(静的リンクしてもGPL感染しない例外あり) の
どれかにするか迷っています。

747 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:43:51.77 ID:8Jdq2NjK.net]
WTFPLライセンスにしようぜ

748 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 23:33:02 ID:Cj3eSjEv.net]
>>721
>"C" だと
>iscntrl() が真を返す値は 0x00-0x1f, 0x7f

ほう、そんなことが規格のどこにかいてあるのですか

749 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 23:58:38 .net]
>>722
Android 4.4.2 Chromeで動作した

750 名前:デフォルトの名無しさん [2019/12/09(月) 01:41:27 ID:ExBOPGUm.net]
ID無いのは5chの人って事?

751 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 01:45:35 ID:aHmkn8DW.net]
有料ユーザーってこと

752 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 01:45:54 ID:dDDj5i4x.net]
これ5chじゃなかったの?

753 名前:デフォルトの名無しさん [2019/12/09(月) 02:33:36.15 ID:ExBOPGUm.net]
そうなんだ。



754 名前:デフォルトの名無しさん [2019/12/09(月) 02:41:32 ID:ExBOPGUm.net]
>>739
なかの人はID付かないのかなって。

755 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 08:06:32.09 ID:V5HcCSm8.net]
>>735
C++ の規格が引用してる C の規格じゃないかな。

質問のつもりで書いてるなら、あまりに態度が悪い気がするし、
「その投稿の内容は間違ってる」と主張したいなら、
もっと直接的・具体的に間違ってるという根拠を示すべきだと思うよ。

756 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 09:58:16 ID:CUCDgsHX.net]
>>736
ありがとう。

757 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 17:54:07.48 ID:c5eP1gUS.net]
>>742
デタラメぬかしておいて根拠を求められたら示せないばかりか
オマエこそデタラメである根拠を出せとか、さすがですね

758 名前:720 mailto:sage [2019/12/09(月) 18:35:46.39 ID:ZGVF76Fo.net]
自己レスです

Visual Studio 16.4では
Intel Parallel Studio 2019 u5は動かないようです。
16.3に戻せないし
どーしよー

https://software.intel.com/en-us/forums/intel-c-compiler/topic/840467

759 名前:デフォルトの名無しさん [2019/12/09(月) 19:45:24.14 ID:ExBOPGUm.net]
POSIXには明確にCロケールの定義が書かれていた。

760 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 20:19:32.09 ID:B3OID8x5.net]
>>745
今のVSの最新版は人柱仕様であり、検証無しでプロダクション用をアップデートしてはいけません
勉強になったねー

761 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 21:02:54.27 ID:HdhKIpY6.net]
昔からVSはそんなもんだ。
てかc++コンパイラなんて全部そんなもんだ。

762 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 21:45:50.54 ID:P+A0aO3e.net]
>>745
リンク先に回避策があるって書いてあるやん

763 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 21:53:17.84 ID:G+eF5KMH.net]
>>746
それはCの規格と必ずしもイコールではないがな。



764 名前:デフォルトの名無しさん [2019/12/09(月) 22:32:03.14 ID:ExBOPGUm.net]
どういうことですか。

765 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:24:28.11 ID:qFr59Y2H.net]
POSIX には ISO C には無い追加の定めがあり、したがって

766 名前:> POSIX にある定めは必ずしも ISO C 一般に言えることではないということです。 []
[ここ壊れてます]

767 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:30:20.36 ID:c5Uv/Cv5.net]
わかったはもうこれからはstd::isspace()とstd::iscntrl()を使うは

768 名前:デフォルトの名無しさん [2019/12/09(月) 23:43:16.79 ID:ExBOPGUm.net]
メンバ変数にstd::listを使うと移動コンストラクタがnoexceptに出来ないのですが。
こんな時はどうするのでしょう。

769 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:58:06.53 ID:aHmkn8DW.net]
メンバのstd::listをポインタにする

770 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:59:06.89 ID:qFr59Y2H.net]
>>754
まず何を見て「出来ない」と言っているのかを明らかにします。

771 名前:デフォルトの名無しさん [2019/12/10(火) 00:04:16.84 ID:KeuWZv5z.net]
https://ja.cppreference.com/w/cpp/container/list/list
僕はいつもここを見ます。

772 名前:デフォルトの名無しさん [2019/12/10(火) 00:06:34.29 ID:KeuWZv5z.net]
std::swapの特殊化がnoexceptです。
これを使いますか。

773 名前:デフォルトの名無しさん [2019/12/10(火) 00:08:47.32 ID:KeuWZv5z.net]
引数無しのコンストラクタがnoexceptじゃないから無理でした。



774 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 00:37:17 ID:OASxW0Hh.net]
そもそも noexcept にする必要性が不明だし、呼び出してる関数が
全部 noexcept じゃなくても std::list 実装を限定してよかったり、特定実装での
bad_alloc =即死の不都合が必要性と釣り合うなら noexcept にすることはできるし、
最大限の移植性も bad_alloc の通知も noexcept もすべて本当に必要なら
>755 でポインタって答えも出てるのに。

775 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 00:41:00 ID:2YzAsKi1.net]
自動でnoexceptに成らないなら、自分で望みのnoexceptの定義すりゃ良いだろうに
部品が例外投げるなら内部でcatchして適切に処理すればいい

776 名前:デフォルトの名無しさん [2019/12/10(火) 00:43:28.28 ID:KeuWZv5z.net]
https://github.com/isocpp/CppCoreGuidelines
これです。

777 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 07:32:12 ID:Xhvd8FYl.net]
>>761
正論

778 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 19:05:35.05 ID:yM6al2d7.net]
途中でcコード通るとか何らかの理由があるんだろう。

779 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:14:22.35 ID:KfdgnhFC.net]
ある一つの変数に対してstd::threadで作成したプロセスは値を更新し続けて、メイン関数の方では値を読み続ける場合は排他処理する必要はありませんか?
メイン関数の方は必要なときだけ値が読めればいいので読みこぼしは無視していいです

780 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:19:53.65 ID:iOg65oSz.net]
>>765
変数が std::atomic<T> でなければ排他制御の必要があります。

781 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:21:20.19 ID:m9WEF2SZ.net]
>>765
atomicでないとだめ。プリミティブな型でもあやしい。
りーどらいとろっくするがよい。

782 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:23:21.98 ID:/1t9T7AP.net]
基本型かつ確実にレジスタでなくメモリに書き出されているならそうだね
std::atomcを使うのが無難
その条件ならmemory_order_relaxedを指定すればバリアのオーバーヘッドは避けられる
面倒だけどね

783 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:35:45.33 ID:IATqHbi6.net]
質問者じゃないけど
読みこぼしとかタイミングによるズレが問題ないとしても排他制御なしに読み書きする時点で未定義動作だからNG
って認識でおk?



784 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:46:34.56 ID:iOg65oSz.net]
はい。
https://timsong-cpp.github.io/cppwp/n4659/intro.multithread#intro.races-20
> The execution of a program contains a data race if it contains two
> potentially concurrent conflicting actions, at least one of which is
> not atomic, and neither happens before the other, except for the
> special case for signal handlers described below. Any such data race
> results in undefined behavior.

785 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 14:00:16.36 ID:/1t9T7AP.net]
言語仕様はそうだろうけど
x86なら実際は多くの場合バリア不要だったりするから
最終的にどういうinstructionになっているのか知っておくと理解が深まる

786 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 15:24:29 ID:nkoUZIKM.net]
x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ

これ以外だったり同期が必要なければ
排他制御は不要

もちろん、
一連のデータリード

787 名前:ナデータの一貫性が必要であれば一貫性確認の仕組みなり排他制御なりは当然必要だし、
コンパイラが読み書きを省略する可能性のあるコードであれば
volatileを付けるなど、省略を防ぐ必要はある

ymmレジスタを使えばアトミックな読み書きが出来るので
256bit以内なら一貫性も保てる

マルチコアARMの場合は
DMB命令を入れておけば確実

パフォーマンスに問題が無い箇所であれば、
移植性の為にも、素直にC++の排他制御を入れておこう!
[]
[ここ壊れてます]

788 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 15:42:23 ID:ax9A/ZTc.net]
お前らRustに移行とか考えたりするの?

789 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 17:37:57.91 ID:bM/oaPHs.net]
>>773
個人的には絶対に移行したくないと思っている。

790 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 17:42:08.10 ID:/1t9T7AP.net]
どっちもやったらええがな

791 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:13:18.74 ID:bM/oaPHs.net]
>>771
質問されたような簡単な場合であっても、少なくとも、80386系CPUでも、
物理CPUを2つ積んでいるようなマシンだと、色々な配慮が必要。
一つの理由は、CPUキャッシュが外部メモリに反映されていない場合が
あるため。
もう一つは、値の変化のタイミングがコードに書いた通りで無い事があり、
僅かにタイミングがずれることで、「すれ違い」現象の様なことが
おきることがある。これが起きると、変数の値をフラグ的に利用して
厳密に何かをやりたい場合に非常に致命的な問題を生じてしまうことがある。
これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
していたらしい。
2つのスレッドでデータをやり取りする場合には色々と注意が必要で、
普通はデータが準備できたかどうかをCreateEvent(),SetEvent(),
WaitForSingleEvent()などで待機して処理するのが基本。

792 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:17:08.59 ID:bM/oaPHs.net]
>>776
スマン。XOR交換命令ではなく、xchg命令だった。

793 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:20:46.73 ID:NtLrnXCf.net]
goよりかはrustの方が全然マシやと思うぞ
最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ〜



794 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:30:30.06 ID:/1t9T7AP.net]
>>776
xchgはsequential consistencyが必要な場合だよ
今回のように単にatomicにread/writeできればいいだけなら不要
お前さんも含めてよくわからん人は使わないのは正解

795 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:36:33.88 ID:bM/oaPHs.net]
>>779
正直言って、俺は、lock, xchg, mfence, prefetch,
キャッシュ制御付き(?)mov各種(大量)
に付いてはちゃんと理解出来てないことは認める。

796 名前:デフォルトの名無しさん [2019/12/11(水) 18:38:56.23 ID:bM/oaPHs.net]
MFENCE
PREFETCH
MOVNTDQA
LFENCE(?)
XCHG
LOCK prefix
WC Memory

↑沢山あるけど、よく分からない。
xchgもちゃんと理解できてない。

797 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:39:59.12 ID:bM/oaPHs.net]
MFENCE, LFENCE, SFENCE。

服のサイズみたいだ。分からん。

798 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:46:12.74 ID:bM/oaPHs.net]
>>779
xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に
1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための
ためのようですね。今回とは余り関係ないようです。

799 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 21:50:49.53 ID:10jfhd7e.net]
>>777
XORを使った交換テクニックがあったのを思い出した

800 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 00:31:42.87 ID:n5d2iAqE.net]
>>765
その場合でも排他制御は基本的には必要。
たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。
別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。

801 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 00:36:46.28 ID:n5d2iAqE.net]
>>765
あとはアレだな、変数の構造にもよるけど、変数を読み込んでる最中に、上位ワードを読み込んだ後に値が変わって下位ワードだけ新しくなるなんてことも
可能性としては0とは言えない。

802 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 00:54:16 ID:UvCIGzud.net]
AVXを使えば256bitを1命令で
AVX512を使えば512bitを1命令で
読み書き可能

803 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 01:00:12 ID:UvCIGzud.net]
x86系だとCMPXCHG命令
ARMだとLL, AC命令

がデータの一貫性確認に使える



804 名前:デフォルトの名無しさん [2019/12/12(Thu) 03:03:25 ID:hmkgwwLY.net]
とんちプログラミングはもう流行らなさそう。

805 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 03:28:17.88 ID:J/GuvI9A.net]
とんちプログラミングwww

806 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 03:55:57 ID:g+q4RhTJ.net]
> これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
> していたらしい。

当たり前じゃね?アトミックな命令を使うのは基本だと思うが

807 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 07:30:46.73 ID:UvCIGzud.net]
XOR

808 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 07:43:20 ID:Vt8W+oPZ.net]
xor rax,rbx
xor rbx,rax
xor rax,rbx
これでswap rax,rbx相当ってことね

809 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 07:53:00.21 ID:UvCIGzud.net]
>>777

810 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 10:43:59.85 ID:r0VN1UlG.net]
condition_variableで待機しているスレッドがない状態でnotify_allしたときの動作ってどうなりますか?

811 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 10:56:19.34 ID:WJA8YZFG.net]
時空が逆流し、針の先から悪魔が生まれる

812 名前:デフォルトの名無しさん [2019/12/12(木) 11:06:56.29 ID:a67Hqgb2.net]
jsに対するTypeScriptみたいな感じで
C++に対するRustっていう認識は間違ってるが
それならC++に対するそれは何が適当なんかある?

813 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 11:10:12.33 ID:Vt8W+oPZ.net]
allに該当する要素の数が0なのを特別視する必要はなさそう



814 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 11:21:14.68 ID:NrsugUJv.net]
非同期な操作やしその瞬間何も起きんなら単にスルーするだけ

815 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 12:01:38.93 ID:Z8SHCwDj.net]
>>797
無い。

816 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 12:26:43.11 ID:gL/Y8Ccu.net]
>>797
Managed C++とかC++/CLIとか

817 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 13:04:34.98 ID:Z8SHCwDj.net]
>>801
それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。

818 名前:デフォルトの名無しさん [2019/12/12(木) 13:08:42.86 ID:b3wcvAqB.net]
C++は型安全だからC++はC++

819 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 14:17:55.83 ID:CNmkwPhj.net]
型安全認定された!

820 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 14:59:18.45 ID:ZWrMIDdu.net]
ていうかTypeScriptはJSが型があまりにもザルすぎて危険だよね、Javaやら
C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた
ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな
そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな

821 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 16:27:22.69 ID:AVYkL4QT.net]
JSが危険ってどういう事?

C/C++は型がない=危険だけど
JSなんかは型安全な言語だからちゃんと例外になって、
メモリ保護エラーとか起こすこと無いけど?

822 名前:デフォルトの名無しさん [2019/12/12(木) 16:39:21.91 ID:hmkgwwLY.net]
Treeの節(Node)は部分木を表すRangeだと考えて差し支えないですかね?

823 名前:デフォルトの名無しさん [2019/12/12(木) 16:47:21.68 ID:hmkgwwLY.net]
C++20のレンジってもしかしてDBのカーソルとかに応用できませんかね?



824 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 18:38:14.77 ID:Ijd1d2r8.net]
毎回フルスキャンしたいならどうぞ

825 名前:デフォルトの名無しさん [2019/12/12(木) 18:59:14.59 ID:hmkgwwLY.net]
ビューで制限できるし遅延評価を目的としたストリームを代弁できるんじゃないかなって思ったのですが。

826 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 19:07:50.30 ID:Z8SHCwDj.net]
>>806
型も宣言も無い事が危険になることが多い。
例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列
を指定してしまっても処理系がエラーを出してくれない。関数を修正して
仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。
この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。
Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって
くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。

また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、
グローバル変数にいれたつもりがローカル変数になってしまっていることがある。

また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数
が使用されたと解釈されてしまう。

どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。

827 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 19:25:03.70 ID:AVYkL4QT.net]
>>811
お前が型安全の意味を間違ってるってことはよく分かった。

メモリ保護エラーなど言語で解決されないエラー
(OSがトラップするエラー)になってしまうことを
型安全じゃないっていうんだよ

言語で例外になるならそれは型安全

828 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 19:44:50.53 ID:Vt8W+oPZ.net]
ぬるぽ

829 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 20:29:23.98 ID:f2lx0DlC.net]
ツンッ

830 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 20:46:51.94 ID:6QhfdrtV.net]
>>808
おそらくできると思う

831 名前:デフォルトの名無しさん [2019/12/12(木) 22:31:55.78 ID:hmkgwwLY.net]
boost.property_treeはノードはコンテナだって書いてる。
アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。

832 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 22:36:00.00 ID:2qfVB5NM.net]
>>812
???
>>811は型安全なんて一言も言ってないけど?

833 名前:デフォルトの名無しさん [2019/12/12(木) 22:37:04.02 ID:hmkgwwLY.net]
仮に、ノードにSTLのリストやベクターを持たせて子ノードを格納すると、別の部分木のイテレータが互換性を持たなくなる。
これはちょっとまずい。
ある部分木の途中からある部分木の途中までを注目することはよくあるから。



834 名前:デフォルトの名無しさん [2019/12/12(木) 22:45:48.06 ID:hmkgwwLY.net]
ノードの物理量が必ず同じであることを利用すれば、データ構造ヒープを木として使うのが良いんだろか。
これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。

835 名前:デフォルトの名無しさん [2019/12/12(木) 22:52:26.39 ID:hmkgwwLY.net]
考えれば考えるほど、ノードに子ノード格納用のSTLコンテナを持たせるのは現実味がなく思える。

836 名前:デフォルトの名無しさん [2019/12/12(木) 22:59:41.49 ID:hmkgwwLY.net]
つまり、型安全はプログラムの健全性を担保するものではなく、C++は型安全とは言えないって事で良いのでは。

837 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 23:02:50.75 ID:+RpJiFi7.net]
jsてのは女子小学生の意味か?

838 名前:デフォルトの名無しさん [2019/12/12(木) 23:04:10.87 ID:hmkgwwLY.net]
型が無いと僕たちには辛すぎるよね。
ミスを発見してくれないから。

839 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 23:36:51.22 ID:Rc7qy7fw.net]
型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。

840 名前:デフォルトの名無しさん [2019/12/13(金) 00:21:19.32 ID:0IHjBlJG.net]
型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。
呼び出し側が責任を持つということになるのかも。

841 名前:デフォルトの名無しさん [2019/12/13(金) 00:22:24.50 ID:0IHjBlJG.net]
型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。

842 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 06:47:47.05 ID:6WB0hlYg.net]
>>824
むしろ(静的)型なんて俺には不要だぜ、ベイビーって奴の方がアホっぽいけどなw

>>825-826
静的型付け 動的型付け
あたりでググってこい

843 名前:デフォルトの名無しさん [2019/12/13(金) 07:17:35.68 ID:0IHjBlJG.net]
機械語は変数に型がない。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。



844 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 07:24:37.08 ID:Ry/2QtNy.net]
まさにBがCに進化するときの考え方だね

845 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 09:49:21.00 ID:wVkcEFxk.net]
>>825
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。

846 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 09:53:03.46 ID:wVkcEFxk.net]
>>826
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。

847 名前:デフォルトの名無しさん [2019/12/13(金) 09:53:50.44 ID:0IHjBlJG.net]
イネーブラ使えば良いのでは。

848 名前:デフォルトの名無しさん [2019/12/13(金) 10:00:20.89 ID:0IHjBlJG.net]
コンセプトコイコイって感じなのかな。

849 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 11:27:07.79 ID:WVlIRY9+.net]
#pragma omp parallel forで
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?

850 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:09:24.89 ID:e6j7CnOm.net]
>C言語には関数の多態性(overload)がない

さらりと嘘をつくやつがおるな

851 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:27:30.70 ID:fi1/rC5j.net]
今UE4と組み込み以外でc++の仕事あります?

852 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:33:53.16 ID:xTSwswyu.net]
オーバーロードあるか?
ディスパッチの方法はいろいろあると思うが

853 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:55:58.62 ID:ftjAwgQI.net]
>>836
USのマイクロソフトに行け



854 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 19:01:03.38 ID:ysGzQi5M.net]
>>830
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。

え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ

855 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 19:52:22.32 ID:6WB0hlYg.net]
>>839
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
関数は無理だがメソッドでいいならPowerShell

856 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 20:00:57.46 ID:ysGzQi5M.net]
PowrShell は型付言語ですからね。
それぐらいでしょ?

857 名前:はちみつ餃子 mailto:sage [2019/12/13(金) 20:54:52.57 ID:1q9LzdDI.net]
用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?

858 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:07:31.92 ID:KHLl2/ku.net]
>>841
うん、1つあれば
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
の反例になるからね

859 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:09:15.79 ID:wKYhuojH.net]
>>843
そしたら、一つぐらいしか無いって俺は意見を訂正するだけなんだが、

お前も同じ関数名の関数を複数用意できるのはスクリプト言語では
PowerShellだけだって訂正するって話でいいの?

860 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:13:12.55 ID:gmdEaqRD.net]
それでいいんじゃないの

861 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:23:18.13 ID:T1rtAOWF.net]
質問です
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分

862 名前:離すると
VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません
本来どっちの動作が正しいんでしょうか?
[]
[ここ壊れてます]

863 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:37:57.11 ID:KHLl2/ku.net]
>>844
別にそれでいいよ
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
が無知からの発言と認めてもらえればいいだけだしw



864 名前:デフォルトの名無しさん [2019/12/13(金) 22:26:34.23 ID:0IHjBlJG.net]
>>846
これも通ってしまった。
#include <iostream>

template <typename T>
constexpr T value = 1;

template <typename T>
constexpr T value = 2;

template <typename T>
constexpr T value = 3;

template <typename T>
constexpr T value = 4;

template <typename T>
constexpr T value = 5;

template <typename T>
constexpr T value = 6;

int main()
{
std::cout << value<int> << std::endl;
}

865 名前:デフォルトの名無しさん [2019/12/13(金) 22:27:26.74 ID:0IHjBlJG.net]
実行結果。

Start
6
0
Finish

最後の定義が有効になってるように見える。

866 名前:デフォルトの名無しさん [2019/12/13(金) 22:28:16.14 ID:0IHjBlJG.net]
Wandbox
C++
gcc HEAD 10.0.0 2019

867 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 22:54:36.18 ID:T1rtAOWF.net]
ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました

868 名前:デフォルトの名無しさん [2019/12/13(金) 22:57:06.09 ID:0IHjBlJG.net]
僕もちょっとわからないんだけど。

869 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 00:21:27.14 ID:stptR0oK.net]
>>836
デスクトップアプリ

870 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 07:31:10.87 ID:SZLGcxYz.net]
>>846
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。

そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?

871 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 08:56:55.09 ID:fBoJLlft.net]
>>854
なんでできるようにしないの?
そっちの方がおかしくね?

872 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 09:02:00.44 ID:SZLGcxYz.net]
なんでという理由も述べたはずだが

873 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 09:53:01.66 ID:fBoJLlft.net]
>>856
だからそれを可能にするようにしてくれ



874 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:02:03.90 ID:SZLGcxYz.net]
ん? 俺は江添じゃねえぞ
奴なら標準会員だから言ってみるのもいいが

875 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:02:27.48 ID:SZLGcxYz.net]
- 標準会員
+ 標準化委員

876 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:08:29.00 ID:yV/FURvf.net]
江添本ダメ絶対

877 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:30:50.58 ID:stptR0oK.net]
江添でもできない

878 名前:846 mailto:sage [2019/12/14(土) 10:35:10.86 ID:QUVSvjZy.net]
>>854
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ

>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが

879 名前:デフォルトの名無しさん [2019/12/14(土) 12:26:05.30 ID:m0rD8Ode.net]
ローマ法王は根競べで決めるらしいですよ奥さん。

880 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 12:26:49.81 ID:gw9aL+td.net]
誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても

881 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 12:35:13.30 ID:SZLGcxYz.net]
>>862
なんかとんがってんな

コンパイラのバグとまで言う根拠は何だ?
相場では規格票の条文だが

テンプレートなのは見ればわかるさ
だから何なのか説明をやめないでくれ

882 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 12:50:37.99 ID:gw9aL+td.net]
>相場では規格票の条文

通産省の癖の抜けない老人はご退場いただきたい

883 名前:デフォルトの名無しさん [2019/12/14(土) 12:58:43.25 ID:m0rD8Ode.net]
これODRの緩和と関係あるんですかね?



884 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:34:08.27 ID:T/HCOnVQ.net]
>>772
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で

安全に動かすには適切にメモリバリアで順序化する必要がある

885 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:37:18.74 ID:JwYnIOEa.net]
>>868
read ==> read
read ==> write
は入れ替わらない

886 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:37:51.96 ID:T/HCOnVQ.net]
といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが

887 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:38:24.93 ID:T/HCOnVQ.net]
>>869
迷信

888 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:39:11.91 ID:JwYnIOEa.net]
ソースは?

889 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:39:40.59 ID:T/HCOnVQ.net]
リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため
そのような保証は無い

890 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:41:05.07 ID:JwYnIOEa.net]
それのソース

891 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:44:15.66 ID:JwYnIOEa.net]
https://github.com/herumi/misc/blob/master/cpp/fence.md

892 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 14:15:12.84 ID:JwYnIOEa.net]
x86系は
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる

シングルコア時代が長かったから

893 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 14:55:10.15 ID:QUVSvjZy.net]
>>865
>テンプレートなのは見ればわかるさ
>だから何なのか
普通に考えて、実体化がまだなのに定義(初期化)を強制される妥当な理由はない、ということ



894 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 14:57:30.67 ID:T/HCOnVQ.net]
確かにリンク先のインテルのマニュアルの
>8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations
>Example 8-2. Stores Are Not Reordered with Older Loads

>Initially x = y = 0r1 = 1 and r2 = 1 is not allowed
と書いてあって>>875と同じことが書いてあるが疑わしい
マニュアルが間違っているのではないか、

ちな
>8byteのデータはアドレスが8の倍数のときにアライメントされている。
から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい
>8.1.1 Guaranteed Atomic Operations
を見たらワカル、

895 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:04:35.33 ID:T/HCOnVQ.net]
つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」
旨が2箇所ぐらいに書かれているが、
ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても
A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、
これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、
マニュアル執筆者の国語の再教育が必要なのではないか

896 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:10:49.52 ID:SZLGcxYz.net]
>>877
おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?

int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ

897 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:13:40.23 ID:PwUHvw+y.net]
お前なぁ
x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ
x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな
storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)

898 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:20:09.00 ID:T/HCOnVQ.net]
そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ

ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…

899 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:21:14.95 ID:k5kIl1RN.net]
>>877
× 普通に考えて
〇 俺の頭の中で

× 妥当な理由はない
〇 妥当な理由は思い当たらない

テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を

900 名前:分離できないことは納得してるのかな?
そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの?

特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、
明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
[]
[ここ壊れてます]

901 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:24:42.79 ID:QUVSvjZy.net]
>>880, >>883
マウント取るのが最優先でまともな回答できない(するつもりも無い)んなら黙っててくれ

>これは宣言と定義じゃなく定義の重複だぞ
externつけたら?

>それをテンプレートの時だけ可能とすることに意義があると思うの?
テンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる

さて、
>× 普通に考えて
>〇 俺の頭の中で

>× 妥当な理由はない
>〇 妥当な理由は思い当たらない
こんなゴミみたいな煽り入れてきたからには逃げるなよ

902 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:32:39.86 ID:SZLGcxYz.net]
>>884
おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;

どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ

903 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:36:57.55 ID:QUVSvjZy.net]
間違えた
Xテンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる
○初期化に使われる定数式の評価を遅らせられる

言い換えれば、宣言と定義を分離できないならconstな変数テンプレートの宣言時には
それに使う定数式内のすべての型が完全型であることを強制されてしまう
=std::is_integral_v = std::is_integral<T>::valueでいえば
is_integral構造体の方が取り回しがいい、ということ
なんのために変数テンプレートが導入されたのか・・・・



904 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:37:56.58 ID:QUVSvjZy.net]
>>885
自分が失敬だからこうなってるとは考えられないんだな
何様だよ、そもそも質問に答えてないだろうが

905 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:43:43.09 ID:SZLGcxYz.net]
>>887
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
を例示しての質問に対して
int test;
int test = 5;
という答えをしているぞ
valueがtestになったのは悪かったが
余計な飾りをとって問題の核心を指摘したんだよ

906 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:48:43.77 ID:SZLGcxYz.net]
家事があるんでしばらく離席する

907 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:58:10.05 ID:QUVSvjZy.net]
規格でそうなってる(テンプレートゆえの特例は無い)のが”わかってるなら”
最初からそう言ってくれれば済むんじゃないの?
>>854を読み直せよ、テンプレートのことが完全にすっぽぬけた上に失礼な回答だろ

>コンパイラのバグとまで言う根拠は何だ?
とまで、って・・・・普通にありえるだろ、動作が違うんだから(未定義とかいう屁理屈は無しで)

で、>>883は逃げたの?

908 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 16:55:24.17 ID:k5kIl1RN.net]
>>886
やっぱり constexpr 変数の宣言と定義を分離して何がしたいのか、
何ができるようになるのか、が見えてこない。ごめんね。

宣言だけ見える constexpr 変数への参照やポインタだけはとれるようになるけど、
それだともう constexpr である必要なくて const 変数でよさそうで、それならふつうに
宣言と定義は分けられるし。

ちなみにテンプレート実体化までテンプレート引数依存箇所の評価はされないから、
宣言と定義を分ける話を「評価を遅らせられる」と言い表しているのも何か間違ってそう。
「記述を遅らせられる」の間違い?

909 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:16:54.80 ID:SZLGcxYz.net]
だめだこいつ
絶望的に人に者を尋ねる態度がわかってない
「言ってくれれば済む」とか図々しすぎ
技術的な議論がしたいがこいつ相手では
不必要にイラついちまって無理だわ
俺そんなに人間できてない

910 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:24:00.92 ID:QUVSvjZy.net]
>>891
すまん、
>テンプレート実体化までテンプレート引数依存箇所の評価はされない
これ検証してみたらたしかにそうだった
手元のコードで完全型を要求されたから、初期化時に不完全型を使えないと思い込んでた
(おそらくconstexprな変数テンプレートの実体化が、必要な型の実体化より先に来てたっぽい
多分構造体か何かでワンクッション置けば解決できると思う)
これなら確かに分けられなくて問題無いね

>>892
>いいか、constexprは翻訳時定数だぞ
>それを翻訳段階9まで未解決のままにできると思うか?
>なんかとんがってんな
>後出しなんかしてるのはそっちだ
>余計な飾りをとって問題の核心を指摘したんだよ
さらには
>最初の口調に戻れよ
の上で
>技術的な議論がしたいがこいつ相手では
>不必要にイラついちまって無理だわ
よくそんなセリフが言えたもんだ
自己評価高すぎじゃない?wwww

911 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:52:18.36 ID:SZLGcxYz.net]
意見が合うとか合わないとか以前の問題
根底的なメンタリティに欠陥がある相手とは話にならない

912 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:58:45.99 ID:k5kIl1RN.net]
FYI

>>846
Bug 68012: g++ incorrectly accepts forward declaration of constexpr variable template
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68012

>>848
One definition rule
https://timsong-cpp.github.io/cppwp/n4659/basic.def.odr#1
> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.

913 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 18:08:23.02 ID:QUVSvjZy.net]
>>895
わざわざありがとう、やっぱgccのバグだったのね



914 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 19:50:50.54 ID:UskLmxJI.net]
GCCに踊らされてスレを浪費した

915 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 20:04:04.94 ID:4qfYuBec.net]
>>837
オーバーロード=多態性じゃないんで…
オーバーライドのことなら当然cで実現できる

916 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 21:11:37.22 ID:zf7JKoX1.net]
>>898
どうやって?
いや、ディスパッチの方法はいろいろあると思うが

917 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 21:15:53.72 ID:SZLGcxYz.net]
禿もそんなことを言いながら
virtualの導入には当初反対から出発したんだよな

918 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 21:26:53.87 ID:00Pm6Tju.net]
>>899
その話題QZ相手にやったばかりなんで自分で調べて

919 名前:デフォルトの名無しさん [2019/12/15(日) 09:10:03.56 ID:LATD77rz.net]
君が忘れた腕時計見つめながら。

920 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 10:29:35 ID:ir8W/KPm.net]
>>898
overload は、同じ関数名で仮引数の型が違う関数を作れるという多態性のことですよ。

921 名前:デフォルトの名無しさん [2019/12/15(日) 10:52:20.53 ID:LATD77rz.net]
ツリーのイテレータがあるとして、イテレータが返すのはノードじゃなくて、ノードの持つ値ですよね?
すると、イテレータは立体機動出来ないといけなくなるけど、begin().begin()とか変ですよね?
begin().parent()とか。

922 名前:デフォルトの名無しさん [2019/12/15(日) 10:59:28.89 ID:LATD77rz.net]
イテレータが返すじゃなくて、イテレータの逆参照が返すかな。

923 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:08:51.65 ID:fGq+HT2S.net]
コレクションとしては子孫ノード全部を列挙できればよくて、ツリー構造に沿った操作が行いたいなら
それに加えて直接の子ノードのみを列挙するイテレータが用意できればいいだろう。



924 名前:デフォルトの名無しさん [2019/12/15(日) 11:17:54.16 ID:LATD77rz.net]
何が子ノードのみを列挙するイテレータを返すかがよくわからない。
ノードの値がイテレータを返すことはできないので、ノードが子ノードを指すイテレータを返すとすると、イテレータの逆参照はノードを返すことになる。
これは意味論的にちょっと違うかなって。
コレクションにおいて位置はイテレータで示されるので、立体的な位置を持つツリーでは、イテレータ自身が立体機動出来て、巡回能力を持つイテレータは、reverse_iteratorのように外部に用意されれば良いのかなと思ったんだけど。
たとえば、レベルオーダーや深さ優先の巡回イテレータがあるとすると、普通に考えるとスタックやキューが内部に必要にある。
というわけでコピーのコストがあるので、これを標準には出来ないんじゃないかなって。

925 名前:デフォルトの名無しさん [2019/12/15(日) 11:22:50.93 ID:LATD77rz.net]
子ノードを指すイテレータの逆参照が子ノードを返すとすると、*node.begin()は子ノードを返す。
**node.begin()は最初の子ノードの

926 名前:値を返すことになるんだけども。
イテレータの逆参照がノードを返す場合、初期化子リストが素直に実装出来てイイんだけども、イテレータの逆参照が値を返さないのが腑に落ちない感じ。
[]
[ここ壊れてます]

927 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:23:28.40 ID:Q+saMC6e.net]
>>903
こらこらoverloadは多態じゃない多重定義だ
多態はpolymorphism間違えるな

928 名前:デフォルトの名無しさん [2019/12/15(日) 11:27:25.99 ID:LATD77rz.net]
イテレータは演算子の実装を求められてるわけではなく、その演算子を呼び出した時の効果を求められてるだけなので、++(int)はスタックをコピーしない方法を考えた。

929 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:30:57.88 ID:fGq+HT2S.net]
そこは値じゃなくてノードを返すイテレータでいいんじゃね?
必要ならイテレータ自体を拡張してもいいだろうけど、この場合はあまり応用できそうもないし。

930 名前:デフォルトの名無しさん [2019/12/15(日) 11:31:53.05 ID:LATD77rz.net]
そうなのかな?

931 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:37:55 ID:PfQY9kAx.net]
まずイテレータで何を抽象化したいかを明確にしなよ
ノードを意識させたいのか?

932 名前:デフォルトの名無しさん [2019/12/15(日) 11:38:38 ID:LATD77rz.net]
STL風ツリーって検索しても絶対出てこないし、CIAが絡んでるような気がしてきた。

933 名前:デフォルトの名無しさん [2019/12/15(日) 11:39:36 ID:LATD77rz.net]
そこがわかんないんだよねえ。
禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。



934 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:45:00 ID:mSzJWPy5.net]
ツリー構造
範囲が広すぎて
汎用化すると使い勝手が悪くなるからしない
ってだけかと

935 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:56:45.76 ID:Q+saMC6e.net]
recursive_directory_iteratorとかね

936 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 12:06:14.82 ID:mSzJWPy5.net]
なんでdirectory?
treeでいいじゃん

937 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 12:22:05.91 ID:Q+saMC6e.net]
いや立体がどうたら言ってるから
じゃあrecursive_directory_iteratorを使うユーザーのコードは
いちいち多重ループだの再帰だのといった処理になるのかって
思ってさ

938 名前:デフォルトの名無しさん [2019/12/15(日) 12:24:23.41 ID:LATD77rz.net]
ツリーは、あるノードの親が知りたいときもあるはず。

939 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:07:24.45 ID:TeOOTcIs.net]
ごちゃごちゃ考える前にイテレータの本分を決めなよ
begin()からend()まで++で走らせた時にどうなってほしいの?
話はそれからだ

940 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:09:44.18 ID:MBW+LfoG.net]
一般にtreeの探索順序はアルゴリズムと深く結びついてるし、
そこ凝りだすと沼だぞ。

941 名前:デフォルトの名無しさん [2019/12/15(日) 13:09:51.26 ID:5G1zfwod.net]
関数ポインタをシリアライズしてファイルとして保存し、
ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?

942 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:13:54.57 ID:nhcuVJi8.net]
関数だろうが変数だろうがポインタはただの整数値でしょ

943 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:18:39 ID:p2D9PeH2.net]
>>923 環境や「利用」の仕方を具体的に限定すればやりようはあるかもね。



944 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:20:48 ID:hicN34V0.net]
次に(別のプロセスで)ファイルを読み込んだときに、
元の関数を同じ番地で参照できると限らんしな。
関数ポインタの配列のインデクスなら大丈夫だろうだけど。

945 名前:デフォルトの名無しさん [2019/12/15(日) 13:23:00.95 ID:LATD77rz.net]
https://ja.cppreference.com/w/cpp/iterator/reverse_iterator/operator%3D
これconstexprになってるけど、どういうときに定数になるんだろ?
end()の時かな?

946 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:39:23 ID:2FA7t6Jx.net]
C++20以降のvector/stringとか
使われる時にconstexprであることを妨げないようにするために付いてるんだと思う

947 名前:デフォルトの名無しさん [2019/12/15(日) 13:47:38.10 ID:LATD77rz.net]
どうもありがとう。

948 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:52:49.06 ID:ph9lwYgM.net]
constexpr関数の中で使うため。

949 名前:デフォルトの名無しさん [2019/12/15(日) 14:30:37.97 ID:o9m7qUoD.net]
デストラクタがデフォルトでvirtualじゃないのは設計不良ではあるまいか

950 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 14:34:47.01 ID:EeC59mXx.net]
あえてベースの方のメソッドを呼びたいなんてことあるのかね?

951 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 14:38:17 ID:p2D9PeH2.net]
>>931 https://isocpp.org/wiki/faq/virtual-functions#virtual-dtor-rationale

952 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 15:15:03.49 ID:K1ul1r/C.net]
>>931
C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする

953 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 15:29:48.68 ID:7Mmj/dyw.net]
virtualでなかったら継承禁止にしても良かったんじゃないかとは思う



954 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 16:19:56.16 ID:AolOnHel.net]
そうするとメタプログラミングに色々と支障が出たはずだし
STLも結構継承使ってるから実現出来なかったかコスト増えてるよ

955 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 16:52:10.11 ID:TkLVy9px.net]
デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは
どうなんだろうか

956 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 17:01:04.52 ID:ph9lwYgM.net]
unique_ptr使えばvirtualにする必要無いのでは?

957 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 17:16:05.58 ID:p2D9PeH2.net]
>>938 んなこたーない。
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?

958 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 18:59:53.87 ID:tmrMX5L5.net]
>>937
>デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
mjk、

959 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 19:10:50.35 ID:AolOnHel.net]
セオリーとして覚えてる人多いけど、何故なのかまで考えてない人が多い例の一つだね
要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る

960 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 19:29:34.24 ID:tmrMX5L5.net]
>>941
>基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
mjk、

961 名前: mailto:sage [2019/12/15(日) 19:42:55.10 ID:gCPcwtH+.net]
永遠の初心者です、お願いします
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?

---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
https://ideone.com/YPlfsC

962 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:01:24.23 ID:01f7hQnX.net]
>>943
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }

963 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:05:17.27 ID:5sPbacoo.net]
エラストテネス
6n+1, 6n+5だけ保持とかってみんな考えるよね

ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュ



964 名前:ェ効くよう分割処理するのが非常に効果的
スレッド分割の為にいずれにしろ分割処理は作る事になる
[]
[ここ壊れてます]

965 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:07:01.24 ID:5sPbacoo.net]
エラトステネス

966 名前:デフォルトの名無しさん [2019/12/15(日) 20:14:20.76 ID:mkXjftMX.net]
高分子エラストマー

967 名前:はちみつ餃子 mailto:sage [2019/12/15(日) 20:20:59.00 ID:jthcUe0A.net]
>>943
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。

968 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:54:13.00 ID:TKBas8kS.net]
>>939

親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.

~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?

969 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:07:41.82 ID:2FA7t6Jx.net]
>>949
いわゆるtype erasure
https://blog.cryolite.net/entries/2006/01/08#p1

970 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:19:04.13 ID:TKBas8kS.net]
>>950
まだ仕組みのとこまでですが理解できました。ありがとうございます。

971 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:24:07.01 ID:tmrMX5L5.net]
質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、
Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい?
1. C++だとsizeof(Foo::Bar)と書いたらおk
2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない
(1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く
(2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ
    (Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く

972 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:39:08.56 ID:tmrMX5L5.net]
ふとオモタがインスタンスの必要性は無くせるかもしれん
Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても
 sizeof(((Foo*)0)->y)
と書けばC言語で逝けるかもしれん…
スゲー気持ち悪いコードだが、、、、

973 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:46:34.52 ID:PfQY9kAx.net]
>>951
あくまでコンパイル時の型で決まるだけだから要注意
例えば

class A;
class B : public A;

A* p = new B();
std::shared_ptr<A> a(p);

これだとBのデストラクタは呼ばれない



974 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:48:17.68 ID:5sPbacoo.net]
なんでそんな中途半端な機能を
わざわざコストをかけて入れたんだろう

975 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:49:32.31 ID:5sPbacoo.net]
やむを得ず
なんだろうけど

976 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:51:55.29 ID:PfQY9kAx.net]
>>953
Linuxカーネルとかそういう感じのマクロ満載だよ
C言語はそういうもん

977 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 22:05:12.60 ID:TeOOTcIs.net]
type erasureと相性悪いんだっけ

978 名前:はちみつ餃子 mailto:sage [2019/12/15(日) 22:15:04.90 ID:jthcUe0A.net]
>>943
思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。

#include <vector>
#include <iostream>

int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0

979 名前:;
}
[]
[ここ壊れてます]

980 名前: mailto:sage [2019/12/16(月) 19:39:21.34 ID:NZyGx79l.net]
>>944,945,948,959
コメントありがとうございます!

>>944,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています

>>948
>初期化リストの中にそんなごちゃごちゃしたこと書きたい?
クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました
一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、
複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても

https://ideone.com/y3ROXS

981 名前:デフォルトの名無しさん mailto:sage [2019/12/16(月) 20:14:24.13 ID:89loOkbp.net]
まあこういう自己満は通過儀礼だよな

982 名前:デフォルトの名無しさん mailto:sage [2019/12/16(月) 21:46:21.90 ID:kSgVv2yp.net]
lambdaの即時評価はjsだと多用されているイメージ
ブロックスコープないからね

983 名前:はちみつ餃子 mailto:sage [2019/12/17(火) 00:52:53.01 ID:0JRJucIS.net]
>>960
> すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました

30 年以上の実績があってもなお仕様に入らない程度に駄目なんだよ。



984 名前:デフォルトの名無しさん [2019/12/17(火) 03:23:09 ID:JQ5aWxOy.net]
プライベートメンバの単体テストってみんなどうしてるのかな。

985 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 03:30:02 ID:nsTCJN+n.net]
#define private public

986 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 03:58:13.47 ID:KUtZUPl9.net]
#if 0
friend test;
#endif

987 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 07:08:07.08 ID:KzMqUd+t.net]
#ifndef NDEBUG
friend struct test;
#endif

988 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 07:46:15.26 ID:wpWnXFFo.net]
闇言語

989 名前:デフォルトの名無しさん [2019/12/17(火) 11:20:07.09 ID:dc1/89bE.net]
namespace Method{ namespace Detail {
template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{};
} }
// 文字列で呼び出すための関数を登録するためのマクロ
#define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \
namespace Method { namespace Detail { \
template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \
using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \
MethodRegister() { \
MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \
} \
~MethodRegister() { \
MethodContainer::GetInstance().Unregister( #FUNC ); \
} \
}; \
static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \
} }
void HOGE(){
std::cout << "Hello World!" << std::endl;
}
void HOGE( std::string text ){
std::cout << text << std::endl;
}
METHOD_REGISTER_METHOD( HOGE, void );
METHOD_REGISTER_METHOD( HOGE, void, std::string );

こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、
関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等
多数の問題が出て詰まってしまいました。
こういった問題を対処するにはどうすればよいのでしょうか?

990 名前:デフォルトの名無しさん [2019/12/17(火) 11:28:10.65 ID:rApV4krM.net]
BOOST

991 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 12:23:52.67 ID:lfJGbKnI.net]
>>966
>>967
リリース時に消す必要あんの?

992 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 18:42:08.59 ID:iYSb7MEE.net]
このへんがいいんでないの。
https://srz-zumix.blogspot.com/2015/06/c-private.html

993 名前: mailto:sage [2019/12/17(火) 19:10:07.01 ID:780pCLgH.net]
>>963
まあ、
({int r; while((r = index(n)) == 0) n--; r;})
の最後の
r;
というのが限りなく非文法的ですし



994 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 21:19:56.70 ID:r3fDxRx7.net]
プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。
まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。

995 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 21:45:39.29 ID:HvtzVY9o.net]
templateでアクセスすると合法的にプライベートメンバにアクセスできる

996 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 21:49:21.80 ID:iYSb7MEE.net]
そんな糞な方法でテストなんかしたくねー。

997 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 01:14:03 ID:zSYbFuJ0.net]
テストなんかお綺麗にする必要が無い

998 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 06:18:11.97 ID:BbfJ/y//.net]
テストのテストが必要になるような意味のわからないテストコードはアウト
テストコードは実行せずに人が読んで理解できなければいけない

999 名前:デフォルトの名無しさん [2019/12/18(水) 07:25:56.60 ID:ksLRDXXy.net]
>>978
どんな感じか見せていただけないでしょうか。

1000 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 07:42:51.80 ID:PEFQbiIG.net]
>>971
絶対必要でもないが
少なくともデバッグ用であることくらい
アピールしたい
//よりNDEBUGという特定ワードを使う点にも拘りがある

1001 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 07:48:17.80 ID:uFDqtnkl.net]
>>979
例えばテストコードの中にループや条件分岐があるようなものはアウト

1002 名前:デフォルトの名無しさん [2019/12/18(水) 11:33:15.65 ID:ksLRDXXy.net]
ループは許してもらえませんか?
データの並びとか検査したいんで。
条件分岐はたぶんないと思います。

1003 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 12:41:59.93 ID:pXzQg2xI.net]
原理主義にすぐ染まるやつw
ご苦労様



1004 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:15:29.66 ID:iEIErwam.net]
テスト用にいろんな複雑なテストも入れてるけど
まずいのか?

1005 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:22:47.07 ID:AjekT9H/.net]
Debugビルドしたら遅すぎて検証できなくて詰んだ

1006 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:34:17.71 ID:YQOjezK4.net]
典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、
テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな
原則的には、期待する出力は全てハードコードするのが正しい
難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ

1007 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:39:53.25 ID:iEIErwam.net]
メカが絡むリアルタイム処理でそんな事出来るかよ

1008 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 15:13:38.33 ID:uFDqtnkl.net]
>>982
Parameterized Testsがあれば十分じゃね?

1009 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 15:16:04.78 ID:uFDqtnkl.net]
>>986
期待する出力をハードコードするから
テストで「○○以上であること」って書くこと無いよね?
こういうテストケースある?言い換えるとそういうマッチャーって必要?

1010 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 15:38:06.38 ID:AmwvkO78.net]
次スレは

1011 名前:デフォルトの名無しさん [2019/12/18(水) 16:59:26.54 ID:ksLRDXXy.net]
よ。

1012 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 17:57:22.30 ID:uFDqtnkl.net]
ほらよ

C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/

1013 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 20:28:47.90 ID:CdPazUY7.net]
>>987
それはまた別の話
ここで言ってるのは単体テストレベルの話だぞ



1014 名前:デフォルトの名無しさん [2019/12/18(水) 21:11:16.67 ID:LM1drZI+.net]
クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい?

1015 名前:蟻人間 mailto:sage [2019/12/18(水) 21:14:21.02 ID:Zo1XP656.net]
>>995
strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.

1016 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 21:14:35.04 ID:uFDqtnkl.net]
C言語でしっかり文字列処理出来るようになったほうがいい? → いい
C++でC言語の文字列処理する? → しない

1017 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 21:16:04.08 ID:aoz4SWmd.net]
>>987
逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。

1018 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 23:15:57.41 ID:cF9WM4jz.net]
>>992

お前らコピー使うなムーブしろ

1019 名前:デフォルトの名無しさん mailto:sage [2019/12/19(木) 00:00:58.14 ID:zX6m0cqE.net]
単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝
Google TestとかTest::MoreとかJUnit使ったらワカル

1020 名前:蟻人間 mailto:sage [2019/12/19(木) 00:08:57.93 ID:r6T/W91o.net]
あれっ?

1021 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 41日 12時間 33分 22秒

1022 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<247KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef