◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

C++相談室 part156 YouTube動画>1本 ->画像>1枚


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1621389313/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん
2021/05/19(水) 10:55:13.24ID:LZZifCH2
前スレ
C++相談室 part155
http://2chb.net/r/tech/1616555235/
2デフォルトの名無しさん
2021/05/19(水) 11:23:50.45ID:b5zC4CMw
3デフォルトの名無しさん
2021/05/19(水) 11:31:17.57ID:FIiQfBQ7
乙でございます
4デフォルトの名無しさん
2021/05/19(水) 11:33:27.40ID:psqzmlBB
乙python
5デフォルトの名無しさん
2021/05/19(水) 11:36:23.16ID:FIiQfBQ7
前スレの>>989
> 可変個の参照の組 (vectorでいい) を関数 hoge に渡したいときって、hoge が vector< reference_wrapper<T> > を取るようにして
> hoge({ref(A), ref(B), ref(C)})
> みたいに呼ぶか、可変引数テンプレートを使って hoge の中でパースするかっていうのが普通のやり方かな?

なんですが、もしかして reference_wrapper って構築時に左辺値を渡したらそれの参照を保持してくれる?
だとしたら
hoge({A, B, C})
と呼べるしかなりスッキリしますね
hoge 内でいちいち get() しないといけないのはダルいですが……
6デフォルトの名無しさん
2021/05/19(水) 12:17:48.45ID:5AVKLAl8
継承や委譲との付き合い方がよく分からなくなった

あるクラスの機能を全部持っていてほしいが is-a 関係がないとかで継承関係にはないように思える場合ってどうすんの
例えば一辺の長さを表す変数やはみ出し判定メソッドを持つ「グリッド座標クラス」があったとして、今「オセロを解くクラス」を作りたいとき

オセロを解くこと is a グリッド座標では全くないし継承するのは頓珍漢に思える
一方で「オセロを解くクラス」がグリッド座標のインスタンスを委譲として持っていたとして、盤の大きさとかはみ出し判定メソッドにわざわざ「グリッド座標クラス」のインスタンスを通してアクセスするのも果たして正しいだろうか
例えば盤面 a と盤面 b を同時に持ったりもするだろうが、a.size() とか b.size() は同じものを表すのでこのようにアクセスするのは可読性を損なう
だから「オセロを解くクラス」は盤面の大きさとかはみ出し判定メソッドを自分のメンバとして持っていてほしいが、継承するべきようにも思えない
7デフォルトの名無しさん
2021/05/19(水) 12:37:51.61ID:mqAmVEur
複数の盤面持つんならメンバで持つ一択だと思うけど
「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
描画の都合とかで外部からアクセスするのが欠かせないなら、インデックス受け取って盤面の参照返すメンバ関数でも用意すればいい
8デフォルトの名無しさん
2021/05/19(水) 12:44:45.80ID:mqAmVEur
あ、あるいは解くクラスが単に外部の盤面を参照する形でもいいかもね
9デフォルトの名無しさん
2021/05/19(水) 12:46:25.42ID:5AVKLAl8
>>7
> 複数の盤面持つんならメンバで持つ一択だと思うけど
「オセロを解く」といった時点で盤の大きさ等決まるんだから、自分のメンバとして基本的な機能持っててほしいと思うんですが、偏った考え方ですかね


> 「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
そう思います
10デフォルトの名無しさん
2021/05/19(水) 12:47:08.07ID:5AVKLAl8
>>8
それはインスタンスとして盤面を持つという意味ではなくですか?
11デフォルトの名無しさん
2021/05/19(水) 12:51:42.12ID:NOe9g/vN
フロント部分とオセロを解くソルバー部分で持ち方変えるってのが普通
12デフォルトの名無しさん
2021/05/19(水) 12:52:13.78ID:mqAmVEur
そう、内包しようとしない方が自然かもしれない
(読んだ範囲で勝手に考えてるだけだけど)
例えばその解くクラスってのがAI的に自動で解くクラスなら、じゃあその対戦相手に同じ(だがインスタンスは別)AIや
プレイヤーが参戦したらどうなるんだ?と考えると
盤面は独立してるほうが自然な気はする(個人の見解です
13デフォルトの名無しさん
2021/05/19(水) 12:54:28.27ID:A2sERbZl
>>6
オセロを解くアルゴリズムとオセロをプレイするモデル次第なのでなんとも。

まあ、オセロを解くんだったら多数のオセロ盤を持つだろうから、グリッドクラスを派生させてオセロ盤クラスを作るだろうな。
人間がオセロをプレイするのを素直にモデル化してもいいけど、ゲーム機のオセロゲームをプレイするようにモデル化したほうが、オセロを解く側のミスや負担が減る。
14デフォルトの名無しさん
2021/05/19(水) 13:23:50.34ID:5AVKLAl8
>>11
フロント部分って今の場合だと「オセロクラス」ってことですか?
つまり「オセロクラス」と「オセロを解くクラス」が、どちらがどちらを含むではなく、やり取りしあって動くべきだということですか?
15デフォルトの名無しさん
2021/05/19(水) 13:26:27.55ID:5AVKLAl8
>>13
派生って継承ってことですか?
つまり必ずしも is-a を満たさなくても機能を全部引き継ぐなら継承は是 (あるいはそうモデル化するのが良い) ということでしょうか
16デフォルトの名無しさん
2021/05/19(水) 14:13:31.63ID:TD1RuTos
かんたんだろ
色々判定してくれるオセロ妖精すなわち神を作ればいい
17デフォルトの名無しさん
2021/05/19(水) 14:28:08.35ID:mqAmVEur
>is-a を満たさなくても機能を全部引き継ぐなら
どちらも自分で書いてるしグリッドクラスも継承を想定して作れるんだからそれでいいとおも
他人の書いた継承を想定してなさそうなのはやめといた方がいいけどね

てかis-a,has-aはあくまで迷ったときの指針に過ぎんし自分で継承が良さそうと感じたならそれで正解だよ
18デフォルトの名無しさん
2021/05/19(水) 14:43:02.57ID:A2sERbZl
>>15
この場合、is-aは「グリッドとして同一視できる」を意味するから、オセロ盤をグリッドとして扱うことができるのなら継承もあり。

ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
オセロ盤とかその他のゲーム盤とかのクラスを(グリッドとして)使うということでもなければ、継承しないほうが設計の自由度を保てる。
19デフォルトの名無しさん
2021/05/19(水) 14:53:47.60ID:5AVKLAl8
>>18
> ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。

まさに、そういった意味論的なところで悩んでいます
まあ実際にオセロソルバを作ろうとしているわけではないのですが、同じような局面に何度も出くわして、継承も委譲もどうも適切でないように思えて最終的に「グリッドクラス」の中身をコピペして「オセロソルバクラス」を作るようなこともしばしばしてしまいます
20デフォルトの名無しさん
2021/05/19(水) 15:26:58.77ID:mqAmVEur
そんなん言い出したらメタプログラミングで取り入れるメンバを選択するための継承なんか全部アウトだぞ
STL内部でやってるようなのも全部

ていうか
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
21デフォルトの名無しさん
2021/05/19(水) 15:43:24.71ID:LZZifCH2
継承でできることを別の手段でもできるって言ってるだけでは説得力がない
そんなん言い出したらC++でできることをCで擬似コード書けるしな

特にコード量が増える「別の手段」を推奨するには
格段に強い理由がないと誰も動かせない
22デフォルトの名無しさん
2021/05/19(水) 16:02:58.49ID:XxOLfc+T
cpprefjp によると std::swap の実装って
void swap(T& a, T& b){
 auto tmp = move(a);
 a = move(b);
 b = move(tmp);
}
みたいな感じですよね?
よくされる「move された後のオブジェクトはどうなってる保証もないのでもう触るべきでない」みたいな説明に照らせば、上のコードは move した後のオブジェクトを再利用してるけど大丈夫なのかなって思ってしまいます
大丈夫なんでしょうか?
また、参照をmoveしたら当然参照元のオブジェクトが「どうなってる保証もない」と考えるべきなんでしょうか?
23デフォルトの名無しさん
2021/05/19(水) 16:39:28.28ID:XxOLfc+T
もう一個質問させてください
引数に参照をとる関数に一時オブジェクトを渡したいこともあるんですが、この場合は const参照か右辺値をとる関数としてオーバーロードするしかないですよね?
24デフォルトの名無しさん
2021/05/19(水) 16:43:38.10ID:TD1RuTos
>MoveConstructibleかつMoveAssignable
こうなってるからヨシ!
25デフォルトの名無しさん
2021/05/19(水) 19:24:14.37ID:8oBHesVz
>>22
move後の変数は、読み取った場合の値はどうなってるか保証できないが、
値を書き込むことは正常に出来る事が保証されていると聞いた。
破棄することや、初期化することも問題ない。
26◆QZaw55cn4c
2021/05/19(水) 19:54:41.64ID:Y2/6iGxL
>>1
お疲れ様です
27デフォルトの名無しさん
2021/05/19(水) 20:51:32.06ID:aTtniYy+
>>25
moveコンストラクタは呼ばれないの?
呼ばれるのなら保証するのは自分自身なのでは?
28デフォルトの名無しさん
2021/05/20(木) 02:43:42.49ID:UJvm/t/I
>>27
moveコンストラクタは、変数定義を
TYPE x = y;
の形式で書いた場合に y が右辺値の場合に呼び出されるだけ。
move代入は、
x = y;
の形式で書いた場合に y が右辺値の場合に呼び出されるだけ。
後者の場合、xがmove後であるかどうかは関係ない。

変数xの中身をmove後のxへの書き込み、xの破棄、x.init()などとしての
再初期化が「保証される」というのは、保証されるようにSTLライブラリなどが
作られているという意味で、コンパイラが保証するというわけではない。
29デフォルトの名無しさん
2021/05/21(金) 05:29:55.67ID:J+Oc/LGb
T が値なら終了して、vector<T> なら再帰的に自分を呼ぶ関数を作りたいのですが、T が vector (あるいはコンテナ) かどうかで分岐する処理ってどうやって書くのが良いですか


あと近い話題で、+ 演算子をオーバーロードして vector + vector が結合された vector を返すようにするのってナシですかね?(string のように)
要素同士の和をとるのと紛らわしいですか?
cat(vector, vector) とかの方が良いかな
30デフォルトの名無しさん
2021/05/21(金) 06:16:08.57ID:682YZm8K
固定長文字列クラスってないんですかね

template<int N> void hoge(string s){
 ……
 assert(N == s.size());
 array<int, N> a;
 ……
}
なる関数を呼び出すときにテンプレートパラメータを省略したいんです
s が固定長なら s から N を推論してくれますよね
31デフォルトの名無しさん
2021/05/21(金) 06:29:04.74ID:682YZm8K
あるいは hoge の引数を costexpr に限る方法なんかがあれば、N は必ずコンパイル時に推論できるようになるの思うので、もしそういうものがあればそれでも大丈夫です
32デフォルトの名無しさん
2021/05/21(金) 11:15:57.88ID:pMLUvwAV
もしかして、C++11に対応したSTLで、BSD/MIT 系ライセンスのものは存在してませんか?
・apache-stlは、2008年くらいで開発が終了しているようです。
・msvc用のstlはapacheライセンスですが、vcruntime.hが存在しないと
 エラーになるようです。
33デフォルトの名無しさん
2021/05/21(金) 12:27:55.17ID:anlX8gXg
apacheで良ければllvm
34デフォルトの名無しさん
2021/05/21(金) 15:55:15.71ID:FMNTAZuF
>>30-31
これマジキボンヌなので何卒よろしくお願いします
35デフォルトの名無しさん
2021/05/21(金) 16:07:34.25ID:wQUXYA+s
>>30
よくわからんが何で長さの相違を型の相違にしたいんだ?

文字列リテラルならこういう手があるけど
template <int N> void hoge(const char(&s)[N])
{
}
36デフォルトの名無しさん
2021/05/21(金) 16:09:26.25ID:zwURlIka
>>34
整数のテンプレート引数を使って、std::stringを継承した文字列クラステンプレートを作ればなんとかなりそう。試してないけど。
std::stringの継承はけっこうクセがあった気がするから、自分で調べてね。
37デフォルトの名無しさん
2021/05/21(金) 16:18:16.28ID:cnTkitrU
>>30
>テンプレートパラメータを省略したいんです
の理由がただお遊びレベルのような気がしてスルーしてたけど
固定長の文字列クラスは標準には無い、欲しけりゃ探すか自分で作れ、それか>>35
38はちみつ餃子 ◆8X2XSCHEME
2021/05/21(金) 16:51:46.16ID:JT5uzYpW
コンパイル時プログラミングのための機能を満載したライブラリ Sprout がある。
constexpr 対応した文字列クラスもある。
http://boleros.hateblo.jp/entry/20110926/1318115291

ボレロ村上が亡くなってもう一年以上たったんだなぁ……。
Sprout のメンテナンスを引き継ぐ大きな組織とかないのかね?
いっそ Boost に編入するとかでもよいような気がするが。
39デフォルトの名無しさん
2021/05/22(土) 04:55:57.93ID:Dt9VIAZx
>>35
> 何で長さの相違を型の相違にしたいんだ?
すみません。どういう意味でしょうか
やりたいことは、関数に渡した定文字列の長さをコンパイル時定数として扱うことです


> 文字列リテラルならこういう手があるけど
ありがとうございます
これが現在やりたいことに最も近いです
2つの文字列リテラルの共通部分列の長さをコンパイル時定数として扱うみたいなこともできそうで、ワクワクしています


>>36-37
ありがとうございます
自作は想像だにしない失敗に繋がりそうなのでやめておきます


固定長文字列とか引数を constexpr に限るとかすごい便利な機能に思えるんですが、今後標準に入ることはあるんでしょうか
それとも僕の不理解で便利に見えるだけなんでしょうか
40デフォルトの名無しさん
2021/05/22(土) 10:24:05.95ID:zUe7A7la
固定長文字列ってCOBOL以外にあるの?
FORTRANにも無いしCにも無い
現行言語には存在すらしない
昔から特殊技術で需要が少ない
41デフォルトの名無しさん
2021/05/22(土) 10:31:31.29ID:tdkMyXe1
malloc使わなかったらcも固定長でしょ
あとsql
42デフォルトの名無しさん
2021/05/22(土) 12:24:13.54ID:oerUOwsX
>>39
文字列長ごとにメソッドが別になってプログラムサイズの肥大化に繋がる。

スタックに文字列を全部乗っけて(若干の)スピードアップを狙うこともあるけど、そのときでも「〇〇文字以下」みたいにサイズ制限するくらい。Delphiの文字列がそうだったと思う。
43デフォルトの名無しさん
2021/05/22(土) 14:32:38.17ID:uYvLH1Gz
>>40
FORTRANにもあるしPascalにもあるぞ
需要じゃなくてお前の知識が少ないだけだろw
44デフォルトの名無しさん
2021/05/22(土) 16:10:33.68ID:F6wYMINE
clangで、#includeや#include_nextした全てのインクルードファイルの
パスの一覧をテキストファイルに出力することは出来ますか?
45はちみつ餃子 ◆8X2XSCHEME
2021/05/22(土) 18:00:59.52ID:+NInCFK+
>>44
-MD オプションかな。 これは gcc と clang で共通。
46デフォルトの名無しさん
2021/05/23(日) 06:05:08.87ID:NALp7ema
すみません
>>5の方法で可変個の参照の組を関数に渡そうとして行き詰まりました

hoge の定義を
template<class T> void hoge(vector< reference_wrapper<T> >);
として、hoge({a, b, c}) と呼んだら T が推論できないとエラーが出ました
47デフォルトの名無しさん
2021/05/23(日) 07:05:25.07ID:apxwsDfF
a, b, c がfoo_t型だとして
単に型foo_tを明示して hoge<foo_t>({ a, b, c}) と呼んだら良いんジャネーノ;;;
48デフォルトの名無しさん
2021/05/23(日) 07:07:18.56ID:apxwsDfF
質問ですがvirtualでないクラスFoo(つまりdynamic_cast適用不能)のオブジェクトをthrowしたら
catchできます?
49デフォルトの名無しさん
2021/05/23(日) 07:30:24.57ID:NALp7ema
>>47
ありがとうございます
ただ、なぜに推論できないのでしょうか

template<class T> void hoge(vector< reference_wrapper<T> >);

template<class T> void hoge(vector<T>);
が両方あってどっちか判断できないって話なら分かるんですが
50デフォルトの名無しさん
2021/05/23(日) 07:33:59.12ID:8ydzk+Rl
reference_wrapper<T> をテンプレート型として認識できないからでしょ
51デフォルトの名無しさん
2021/05/23(日) 07:51:37.19ID:NALp7ema
>>50
ありがとうございます
コンテナの入れ子の中に T があっても推論してくれる例を知っていたので、いつでもできるのだと誤解していました
52デフォルトの名無しさん
2021/05/23(日) 08:00:14.50ID:apxwsDfF
{ 1, 2, 3 }というだけではstd::vector<int>なのかstd::vector<double>なのか(ひょっとしたらstd::vector<long>とかかも??)
わからないからという理由
自動型変換結果とのマッチングは追求しだすときりが無いので規格でどの範囲でやるか制限がかかっているたはず
53デフォルトの名無しさん
2021/05/23(日) 08:08:22.67ID:p04S1woO
>>48
C++はintだって投げられるし捕まえられるぞ
54デフォルトの名無しさん
2021/05/23(日) 08:15:35.83ID:apxwsDfF
>>53
投げたブツの型の情報がどうやってcatchする場所に伝わっているのかキボン
55デフォルトの名無しさん
2021/05/23(日) 08:18:02.28ID:W+jRvSTD
以心伝心
56デフォルトの名無しさん
2021/05/23(日) 08:30:19.77ID:GrP2Tvrl
Emacs で LSP 使わず開発してる人いる?
おもしろ設定とか参考になるサイトあったら教えてほしい

flycheck しか入れてない
57デフォルトの名無しさん
2021/05/23(日) 09:14:09.25ID:p04S1woO
>>54
関数呼び出しと一緒やぞ
catch節に書いた仮引数でオーバーロードしてると思えばいい
58デフォルトの名無しさん
2021/05/23(日) 09:31:01.96ID:apxwsDfF
>>57
ありえん
1つのthrowに対し、呼び出し元のcatchで呼び出すべき(オーバーロードされた)関数シンボルを一意に列挙できるなら
アンワインド時にオーバーロードのしくみで例外ハンドラの解決を行えるかもしれないが、これは論理的に成り立たない
なぜなら、例えばintを例外をスローする関数foo()がbar()とbaz()から呼ばれているとして、
bar()にcatch (int)が書かれているのにbaz()に描かれていないとした場合、
bar()経由の呼び出しにおいては(オーバーロードされた)関数シンボルのリストに func(int)が含まれるのに対し、
baz()経由の呼び出しにおいては(オーバーロードされた)関数シンボルのリストに func(int)が含まれない、
となって一意にならず、throwした瞬間にどっちなのか解決不能
やっぱcatch側が(何が来るかわからない状態で)待ち受けているとしか考えられない
59デフォルトの名無しさん
2021/05/23(日) 09:40:45.57ID:apxwsDfF
ちょっち補足すると、
bar()でtry { foo(); } catch (int ex) { .... } したときに handler(int)を例外ハンドラのリストに動的に登録し、
baz()ではtry { foo(); } catch (int ex) { .... } が無いからhandler(int)を例外ハンドラのリストに動的に登録しないようにすれば、
foo()でthrowしたときに最新の例外ハンドラのリストを参照することによって解決はギリ可能だが、
スタックとは別に例外ハンドラのリストに動的に管理するみたいなことをしているのかとカナーリ疑問に、
(例外がfall throughする関数の中にはゼロコストの奴も含まれるので、スタック上で細工して例外ハンドラのリストを更新管理することは不可能
60デフォルトの名無しさん
2021/05/23(日) 09:42:11.13ID:vhcqGTpc
>>54
exception_ptr
61デフォルトの名無しさん
2021/05/23(日) 09:52:50.26ID:apxwsDfF
exception_ptrの主な用途は、バックグランドスレッドからメインスレッドに、例外オブジェクトを持ち運ぶ、というものである。標準ライブラリにおいては、promiseとfutureの実装で使用される。
と書いてあってスレッド間をまたぐ用(promiseしたことを実行中に起きた例外を、promise完了を待っているやつに伝える)とき限定に見える

単純にcalleeからcaller側に飛ばす通常の例外ではどうなのや??

intやdoubleやconst char*を型情報とともに収容可能なexception_ptrみたいな構造体が絡んでいるのだろうとは思いまするが
62デフォルトの名無しさん
2021/05/23(日) 09:54:00.48ID:apxwsDfF
イマイチ確証が無い
63デフォルトの名無しさん
2021/05/23(日) 10:08:43.53ID:vhcqGTpc
>>61
スレッドは関係ないぞ
同一スレッドでも監視ブロックを抜けrた後でrethrow_exceptionできるし
64デフォルトの名無しさん
2021/05/23(日) 10:30:51.86ID:apxwsDfF
>>63
言わんとすることはわかりまするが
(そもそもpromise/futureのしくみも論理的には単なる継続なので単一スレッドでの実装もあり得るという意味でスレッドは関係無い
しかしrethrow_exception(ex)はrethrow_exception(ex)であってthrow exとは別の文やん??
本当に単純にcalleeからcaller側に飛ばす通常の例外も同じしくみなのかどうか、、、
65デフォルトの名無しさん
2021/05/23(日) 10:45:18.88ID:apxwsDfF
スマン>>58>>59は撤回
やっぱ関数のオーバーロードで呼び出すべきハンドラを解決している可能性がありえまつね
というのはスタックにはreturn addressが積まれているので、throw intするfoo()は、
throwする瞬間に自分がbar()経由で呼ばれたのかbaz()経由なのか判定可能
あとはreturn addressに対して呼び出すべきハンドラ(のシンボルのリスト)を与えるテーブルがあれば、
関数のオーバーロードで呼び出すべきハンドラを解決できる
極力実行コストを低くする手となるとこれかなあ……
長々とスマンカッタ、継続調査しまつ
66デフォルトの名無しさん
2021/05/23(日) 12:13:22.18ID:MJ9lD3tL
>>56
>Emacs で LSP 使わず開発

その発想がナンセンス
67デフォルトの名無しさん
2021/05/23(日) 13:43:41.87ID:p+CWzw6b
>>66
lsp-mode インストールしてファイル開いてみたら「これはなんのプロジェクトにも属してないファイルだ」とか言って何もしてくれなかったもん
テキストエディタだぞ
単一ファイルのソースも普通に編集できるべきだ
68デフォルトの名無しさん
2021/05/23(日) 13:53:03.07ID:P4UGjjTl
インストールさせるという選択肢である以上は
emacs側はそれをやるかどうかの選択をユーザに委ねていることになる
なのでNoという選択もありうる、とemacs側は考えている

選択肢が無く強制なら選択をさせずインストール現象もまた起こらない
インストールさせるということはYesかNoかをユーザが選ぶことができる仕組みになっているからだ
YesでもNoでもなく選択出来ないならインストールさせない仕組みになっているハズだ
ここでインストールできるということはユーザのYes/Noの意思が尊重されることに他ならない

選ぶ・選ばない・強制、などにおいて、選ぶことが出来る事象については何を選択してもいいし、emacs側もそれを容認している
69デフォルトの名無しさん
2021/05/23(日) 14:03:17.45ID:JOTdPSSV
>>45
有難う。
70デフォルトの名無しさん
2021/05/23(日) 14:27:22.85ID:vhcqGTpc
>>64
よくわからんが、こういうこと?
void caller()
{
exception_ptr ex;

ex = callee();

try
{
rethrow_exception(ex);
}
catch(double err)
{
cout << "What the hell does that mean?\n";
}
}

exception_ptr callee()
{
try
{
throw 0.1;
}
catch(...)
{
return current_exception();
}
}
71デフォルトの名無しさん
2021/05/26(水) 14:25:57.68ID:h0MuFhR9
クラスAがクラスBのインスタンスをメンバに持つとき (移譲っていうんだっけ?)、Bのコンストラクタってどーやって呼ぶんよ
72はちみつ餃子 ◆8X2XSCHEME
2021/05/26(水) 15:13:47.43ID:BWKw9sIj
>>71
メンバ初期化子リスト
https://ja.cppreference.com/w/cpp/language/initializer_list
73はちみつ餃子 ◆8X2XSCHEME
2021/05/26(水) 16:01:46.87ID:BWKw9sIj
C++20 からは std::string は constexpr 対応になっとるな。
実装が追いついとるかどうか知らんけど。
74デフォルトの名無しさん
2021/05/26(水) 17:48:11.97ID:ArjioGpg
vectorもconstexpr
75デフォルトの名無しさん
2021/05/27(木) 04:38:09.87ID:wOxUHlR5
constexpr引数ってコンセプトとか使っても無理なん
76デフォルトの名無しさん
2021/05/27(木) 10:11:42.93ID:KxmxhHMB
なぁ…何気に…普通に…何の気なしに…以下の様なコードを書く…
textView1->get_source_buffer()->place_cursor(
textView1->get_source_buffer()->get_iter_at_line(minusList.front() - 1));
なんだけどさ…このplace_cursorの引数はiteratorなんだが…この一時的に作った無名の変数の寿命って…
どうなってるの?…ちなみに…place_cursorは&で受ける…やばいのかな?
77デフォルトの名無しさん
2021/05/27(木) 10:35:07.24ID:KxmxhHMB
place_cursorを実行している段階では…生きている…そうだ…次のステップに移行すると…消える…らしい
ほんまかいなと思いますが…一応…信じておきます…
78デフォルトの名無しさん
2021/05/27(木) 11:20:16.69ID:tgaRcrWk
またお前か
79はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 13:24:29.13ID:tXzwBfxM
>>76
一時的なオブジェクトの寿命が完全式の終わりであることは保証されている。
https://timsong-cpp.github.io/cppwp/n3337/class.temporary#3

参照が一時オブジェクトに束縛されているときは更に寿命が延長されることもある。
80デフォルトの名無しさん
2021/05/27(木) 14:31:37.41ID:U0nLnJgd
勝手に消えるのは確かだが
いつ消えるかは確定出来ないんじゃないの?
次の行の実行中かも知れないし
もう少し生きてるかも知れない
関数抜けたら消えるだろうけど
81デフォルトの名無しさん
2021/05/27(木) 14:35:50.64ID:P6misAvy
その、意味があるとかないとかを、どうやって判断するかと聞いてるんじゃないかね
82デフォルトの名無しさん
2021/05/27(木) 14:57:58.21ID:THQ6jHMK
記述時に事細かに寿命を制御・確定できるような時制プログラミングを作ればいい
C++の場合だと新しい原理を作ればいい
83デフォルトの名無しさん
2021/05/27(木) 15:03:35.45ID:kQVwJQto
> 参照が一時オブジェクトに束縛されている

一時オブジェクトが参照に束縛されている、だろ
ここではconstでない左辺値参照は含まない
84はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 15:10:56.23ID:tXzwBfxM
>>83
> 一時オブジェクトが参照に束縛されている、だろ

いいえ。 束縛されるのは参照で束縛するのはオブジェクトです。
85デフォルトの名無しさん
2021/05/27(木) 15:24:54.29ID:kQVwJQto
>>84
規格票での言葉遣いはこうなっているぞ
CA &&r = A{}; // OK, reference binds to temporary array object
86はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 15:27:03.62ID:tXzwBfxM
>>85
実際はそこらへんいいかげんなんですよ。
87デフォルトの名無しさん
2021/05/27(木) 15:30:34.22ID:kQVwJQto
いや、おかしいだろ
rand(); //ここで消えてしまう一時オブジェクトを
auto&& a = rand(); //引き止める(束縛する主体が参照で
客体が一時オブジェクトだぞ
88デフォルトの名無しさん
2021/05/27(木) 15:31:06.17ID:kQVwJQto
typo
(束縛する)
89はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 15:46:15.37ID:tXzwBfxM
>>85
このへんのセクション内部ではどちらの表現もある。
https://timsong-cpp.github.io/cppwp/n3337/over.ics.ref

"自由変数と束縛変数"
https://ja.wikipedia.org/wiki/%E8%87%AA%E7%94%B1%E5%A4%89%E6%95%B0%E3%81%A8%E6%9D%9F%E7%B8%9B%E5%A4%89%E6%95%B0

このへんの数学的用語では束縛されているのは変数で、 ML 系とか Scheme とかでも一貫してこの用法に従ってるんだけど、
めんどいから私は「××との間に束縛を持つ」みたいな言い回しでどちらが主語なのか曖昧にしたりしてる。

今回の場合は >>79 で示した通りオブジェクトの寿命に関する項目での表現では束縛されているのは参照だから
それにならっただけでどっちがどっちでもまあ重要じゃないよ。
90デフォルトの名無しさん
2021/05/27(木) 16:09:02.89ID:kQVwJQto
>>89
1つめのリンクでは
結合する主体は参照を宣言するコンテキストだね
結合される客体がオブジェクトである点は変わってない

数学や他言語がどうたらには付き合ってやんね

ちゃんとC++の話のなかで例えるなら
実体定義と外部宣言はどちらが使われる側と使う側なのか
のような話だろ
91デフォルトの名無しさん
2021/05/28(金) 04:05:49.41ID:cE/PGHSY
そことは直接関係ないけど、cppreferenceの英語版って、英語として文法的におかしい
ことが有る気がする。主語が無くていきなり三人称単数現在のsが付いた動詞で
始まっている文章も、見出しの直後ならダメではないが、見出しの直後以外の
if節の後にあったりして、しかもそれがif節の中に繋がっていなくて、本来なら
主語を省略できない場合とか。
Microsoftの英語版はすらすら読めるけどcppreferenceの英語版は読めない。
92デフォルトの名無しさん
2021/05/28(金) 04:22:43.88ID:bFqxphgp
int 配列の参照って
int (&a)[N]
であって
(int&) a[N]
じゃないよね?
後者は「参照の配列」を意味するようで変なのは分かるんだが、前者は前者でどこに&ついてんねんって感じなんだが
93デフォルトの名無しさん
2021/05/28(金) 04:30:30.62ID:O9o6B/0s
>>91
てにをはがおかしいのは日本国憲法に比べればかなりマシ。がまんしろ
94デフォルトの名無しさん
2021/05/28(金) 04:57:54.48ID:0J3ydS6A
>>92
>int (&a)[N]
それは、数学記号の様に読み取ることが出来る。
()は優先順位を変えているだけ。
優先順位に従って書いてみると、
a --> & --> [N] --> int
となる。これにより、
「a は、参照で、それは、[N] を指し、その要素は int である」
と読めて、もう少し自然な言語に直すと
「a は、参照で、それは、N要素の配列を指し、その配列の要素は int である」
となり、さらにわかり易くすると、
「a は、要素が int の配列を指している参照である」
となる。このように数学の式変形の様な工程を経ているだけの、単なる計算の様な
ものに過ぎない。
95デフォルトの名無しさん
2021/05/28(金) 05:01:18.55ID:0J3ydS6A
>>94
[補足]
a --> & --> [N] --> int
を英語で読んでみると、
「a is & to [N] to int」
となる。& を「reference」、[N]を「N要素のarray」に置き換えてみると、
「a is reference to "N要素の配列" to int」
となる。日本語に直せば、
「aは、int 型の N要素の配列への参照」
となる。
96デフォルトの名無しさん
2021/05/28(金) 05:51:02.47ID:bFqxphgp
それはたとえば
int (a&)[N]
などを禁止する理由になってるだろうか
97デフォルトの名無しさん
2021/05/28(金) 06:18:19.72ID:fuFcwWPl
参照修飾子はすぐ右にある対象を修飾する
98デフォルトの名無しさん
2021/05/28(金) 06:24:24.88ID:Q2cy611+
>>39
> 2つの文字列リテラルの共通部分列の長さをコンパイル時定数として扱う
をやろうとして苦戦しています
再帰 constexpr 関数で計算しようと思ったんですが、引数として受け取った文字列リテラルの要素って定数と見なせないですよね?

そもそも無理か、勉強次第でできるかだけでも教えていただけたらありがたいです
99デフォルトの名無しさん
2021/05/28(金) 12:14:40.97ID:sAi5WsuI
>>96
(a&)
の部分は、()は優先順位を変えているだけなので、コンパイラは
a&
という部分式を認識しようとする。しかし、a& という部分式は
C++では文法的に存在して無いのでエラーとなる。
単にそれだけの事。
100デフォルトの名無しさん
2021/05/28(金) 12:22:24.96ID:sAi5WsuI
>>99
[補足]
C++コンパイラが
int x[N];      // (1)
というテキストをパースする際、コンパイラ内部では、
x --> [N] --> int
という順序の演算が並んでいると理解されている。そして、
int (&a)[N]     // (2)
というテキストをパースする時、優先順位括弧があるために、
(1)において、x を &a に置き換えたようにコンパイラは理解するなので、
数学の式変形での「代入」のように考えて、
&a --> [N] --> int   // (3)
のようになる。そしてさらに、&a は、a --> & のように式変形されるので、
(3) に安全のために優先順位の()を付けてそれを「代入」すると、
(a --> &) --> [N] --> int   // (4)
となる。しかし、この場合、優先順位の括弧ははずせるので、
a --> & --> [N] --> int   // (5)
となる。ここで、もとのテキストが、
int (a&)[N]     // (6)
だったならば、x が a& に相当することになるが、a& という部分式はC++には
存在しないので、そこでエラーになる。
101デフォルトの名無しさん
2021/05/28(金) 12:48:09.21ID:sAi5WsuI
>>100
[さらに補足]
C++では、「宣言文」と地の文における「式」とは別扱いになっている。
なので、式における &a と宣言文における &a では、& の意味が異なる。
今回の場合は「宣言文」。
宣言文における &a は、a が参照型であることを意味する。
式における &a は、a のアドレスを取得する演算子である。

> x --> [N] --> int
> という順序の演算が並んでいると理解されている。

において「演算」と書いたのは、適切な言葉が見つからなかったため。
演算といっても、今回は宣言文ので、式における演算子とは意味が違う。
式に置いて x[y] は、常に *(x+y) と等価な演算子であるが、
宣言置いて x[N] は、演算子ではなく、x が N要素の配列型であることを
意味しているだけである。
また、最後の xxx --> int も演算子ではなく、型指定部と呼ばれ、
xxx の部分が int 型であるということを意味しているだけである。

しかし、コンパイラ内部では、
x --> [N] --> int
のように意味解釈がされていることだけは確かである。
102デフォルトの名無しさん
2021/05/28(金) 12:59:39.48ID:yA47hu4B
>>101
> 「演算」と書いたのは、適切な言葉が見つからなかったため

抽象構文木?
長いしもうちょっと整理してから書いてや
独自記法もやめてな
103デフォルトの名無しさん
2021/05/28(金) 13:02:59.68ID:sAi5WsuI
>>102
抽象構文木とは限らない。
104デフォルトの名無しさん
2021/05/28(金) 13:10:26.55ID:sAi5WsuI
>>102
整理すると理解できないと思うぞ。
俺は個の痛手は良く馬鹿にされるが、IQは170くらいある。
105デフォルトの名無しさん
2021/05/28(金) 13:20:08.34ID:fuFcwWPl
IQが20違うともう対話が成立しないって聞いたことがある
106デフォルトの名無しさん
2021/05/28(金) 13:31:32.53ID:ymLe7hdU
「a&は禁止されてるから禁止」て言ってるだけじゃねえか
バカなのかコイツ
107デフォルトの名無しさん
2021/05/28(金) 14:17:05.39ID:sAi5WsuI
>>106
そうじゃない。a& という部分式が、記号として未定義と言っている。
禁止じゃなく、未定義。数学でも、
-a
は符号反転とか、負符合という意味で定義されているが、
a-
は定義されていないのと同様。
禁止ではなく、定義されない。だからエラーになる。
108デフォルトの名無しさん
2021/05/28(金) 14:21:07.08ID:yA47hu4B
「パーサーが受理しない」なら言っていい
109デフォルトの名無しさん
2021/05/28(金) 14:40:50.20ID:fuFcwWPl
未定義って言ってんじゃん
パーサーなんて規格票で使わない用語を持ち出す必要ねえよ
110デフォルトの名無しさん
2021/05/28(金) 14:40:59.94ID:sAi5WsuI
>>108
それでは、なぜ受理(認識)しないのかという理由が曖昧。
理由は、そのトークン列が「未定義だから」。
111デフォルトの名無しさん
2021/05/28(金) 14:46:15.77ID:yA47hu4B
>>110
還元できる構文規則がないからだよ
redexは非終端記号も含むから「トークン列」はそもそも誤り
112デフォルトの名無しさん
2021/05/28(金) 14:50:28.42ID:sAi5WsuI
>>111
専門用語をなるべく使わずに平易に説明してるつもりだった。
113デフォルトの名無しさん
2021/05/28(金) 14:55:24.82ID:sAi5WsuI
俺は、非終端記号、構文規則、redex、受理みたいな専門用語はなるべく使わずに、
生まれながらの頭の良ささえあれば理解できる様に書いたつもりだ。
だから、他に本などを読まなくても俺の説明をちゃんと読めば、数学的に高IQの人なら
理解できるはず。
114デフォルトの名無しさん
2021/05/28(金) 15:32:28.15ID:noi5k0SL
>>105
115デフォルトの名無しさん
2021/05/28(金) 15:39:25.96ID:fuFcwWPl
> 独自記法もやめてな

脳天にどでかいブーメランぶっ刺さってんぞw
116デフォルトの名無しさん
2021/05/28(金) 19:49:19.58ID:ymLe7hdU
定義されてないから未定義なのか
定義できないから未定義なのか

未定義にしている理由なら、禁止してるから定義にないのは当然じゃん
定義にあるのは許可されたやつだけだから禁止されたものは書かれてない
定義に無いから禁止されてる
未定義=禁止であって、未定義なのは禁止されてるから

なんで無いのかを聞いてるんだからどっかで禁止されたんだろ
で、答えが「未定義だから定義には無い」「禁止されたから禁止されている」何も言ってないじゃないか

なんでそのルールが無いのか、ルールそのものには書いてないじゃん
117デフォルトの名無しさん
2021/05/28(金) 20:19:45.17ID:cxRyZpXl
>>116
???
c++標準で未定義と定義されているのが「未定義」だろ。

>定義されてないから未定義なのか
>定義できないから未定義なのか
どちらもc++の「未定義」じゃない。
c++標準くらい読めよ。
118デフォルトの名無しさん
2021/05/28(金) 20:26:19.34ID:9RgT2QcU
関数呼び出し時の引数の評価順は未だに未規定(unspecified)ですね
でも未定義(undefined)ではない
最適化をしやすくするためとか
119デフォルトの名無しさん
2021/05/28(金) 20:42:46.54ID:ymLe7hdU
コイツが言ってんのは、構文解析の規則にないから未定義であり禁止、だろ
禁止されてんのは構文規則には入ってないです、未定義だからです、だから禁止です、ってな

そりゃ構文規則には受理する規則だけが書いてあるだけなんだから受理しない規則は書いてない
定義しない理由があったんならそりゃ禁止する理由だ
でなければ定義に書かれている

構文ルールに入って無いのはそのルールが未定義なのか禁止されてるだけなのかそもそも定義できないのか、それは分からないだろ
だから禁止されているかどうかの答えにはなってない

禁止されたから構文ルールには入ってねえんだよ
120デフォルトの名無しさん
2021/05/28(金) 23:14:02.41ID:/t1wIdDl
ある入力を受理するかどうか未定義ってどうやって書くんじゃ……
わざとあいまいなNFAにでもするのか…………
つかBNFはPDAなのでは……………………
PDNFAみたいなもんがこの世にはあるんか…………………………………………
121デフォルトの名無しさん
2021/05/29(土) 01:22:28.79ID:3Clqo4vt
初期化されてない自動変数やポインタを使うのはスリルあるね
122デフォルトの名無しさん
2021/05/29(土) 01:28:07.59ID:ppnc++Os
>>120
構文規則には、その言語(C/C++など)で定義されたパターンを、非終端記号と終端記号を
組み合わせてBNFなどを使って書く(その構文規則をコンパイラ理論では「文法」と呼んでいる。)。
トークン列が、その構文規則のパターンに当てはまる場合、「認識された」という。
このとき、認識されないトークン列はエラーであり「受理されない」。
ようは、文法規則に当てはまってないトークン列が、「受理されない/未定義」。
123デフォルトの名無しさん
2021/05/29(土) 01:39:13.51ID:QJfgb1eG
>>116
C++の宣言文において、&x を x が参照型であることを意味する文法を最初に
定義するのは、人間。そういう言語にしたいからそうしただけ。
そしてその文法は、(必須ではないが)、BNFなどを使った構文規則として仕様公開される。
C++の構文規則には、x&というパターンは書いてない。
なので、積極的に「禁止」しなくても、トークン列にx&というものが現れても、
どの構文規則にも「マッチング」しないのでエラーが表示される。
それだけのこと。
124はちみつ餃子 ◆8X2XSCHEME
2021/05/29(土) 02:08:34.72ID:F7QShN9h
仕様が提示する構文規則 (BNF) に合致しないというレベルの違反は診断対象規則 (diagnosable rules) に反するので処理系がユーザに通知する義務はある。
125デフォルトの名無しさん
2021/05/29(土) 02:51:05.83ID:gVnTXjgE
>>122
受理されなかった入力は非マッチなのであってエラーの一択なのでは……
126デフォルトの名無しさん
2021/05/29(土) 02:53:15.80ID:gVnTXjgE
>>123
x&とかxが型なら普通にパターンとして現れるのでは…………
127デフォルトの名無しさん
2021/05/29(土) 03:11:30.39ID:gVnTXjgE
「C++の構文規則にマッチする入力テキストの集合」が一意確定になることを疑う理由は無いから
入力テキストにわざわざ未定義などというクラスを設けるする必要は無いのでは……………………
128デフォルトの名無しさん
2021/05/29(土) 03:13:13.35ID:QJfgb1eG
>>126
構文規則の中に x&y は存在しているが、x&単独では存在していない。
だから、z = x&y; や z=(x&y) は受理されるが、z = x&; や z=(x&)
はエラーになる。
129デフォルトの名無しさん
2021/05/29(土) 03:14:43.85ID:QJfgb1eG
>>126
おっと、読み間違えた。
xが型の場合は受理されるよ。
xが名前トークンの場合は受理されない。
130デフォルトの名無しさん
2021/05/29(土) 03:21:31.22ID:QJfgb1eG
>>129
[補足]
・xが名前トークンでも意味論的にxが型名とみなせる場合にはxは型だと扱われる。
・xが変数名の場合には変数だとみなされる。
・xが変数名の場合には、x&yは文法の中の有る規則にマッチングするので
 受理されるが、xが変数名の場合にはx&という文法規則は存在してないので
 どんな文法規則にもマッチングできないのでエラーになる。
131デフォルトの名無しさん
2021/05/29(土) 03:24:12.95ID:QJfgb1eG
>>130
[さらに補足]
・xが(ユーザー定義の)型名の場合でも、それが現れる文脈次第で
 x&が受理され無い事がある。
 文脈によって受理されるパターンが違うので。
132デフォルトの名無しさん
2021/05/29(土) 16:51:48.20ID:thkl3N6c
たぶんくそしょうもない質問いいですか

コンストラクタの初期化子リストで
まさに今初期化したばっかりの他のメンバを使うのはアリですか

class Foo{
Foo(Bar bar,Baz baz);
Bar bar_;
Baz baz_;
...
};

Foo::Foo(Bar bar,Baz baz)
:bar_(42)
,baz_(bar_) // ← これ
{...
自分の環境では動いてるようですが
規格に照らし合わせて合法なものなのでしょうか?
133デフォルトの名無しさん
2021/05/29(土) 16:59:07.85ID:RxiQSMqK
>>132
クラスのメンバ変数は定義に書かれた順に初期化されるから、その例についてはokなんじゃないかな
134はちみつ餃子 ◆8X2XSCHEME
2021/05/29(土) 17:29:48.88ID:F7QShN9h
メンバ初期化子として書いた順ではなくクラス定義内のデータメンバ宣言順に従うというのが重要ポイントで、
勘違いを防ぐために宣言順とメンバ初期化子の順序は一致させるのが一般的な習慣になってる。
(一致させなくてもそれ自体は規格違反ではない。)

C++20 から入る指示付初期化 (Designated initialization) で順序を一致させるのが必須に
なっているのはこのへんの反省があったんだと思う。
135デフォルトの名無しさん
2021/05/29(土) 19:10:01.56ID:thkl3N6c
各位 ありがとう

>>134
後半はへーって感じなので調べてみる
136デフォルトの名無しさん
2021/05/31(月) 20:14:45.42ID:OyXVhXUR
構造化束縛とか範囲for文が必ず新規にオブジェクトを宣言しないといけない仕様になってるのが何気に解せないのだが
既存のオブジェクトを使い回せた方が都合良いだろうに、なぜこういうことになったの?
137デフォルトの名無しさん
2021/05/31(月) 20:47:21.20ID:6/QCGWOG
構造化束縛の方はtieで行けるだろ

int a, b;
std::tie(a, b) = std::make_pair(1, 2);
138デフォルトの名無しさん
2021/05/31(月) 20:48:51.74ID:7Qq6EdKQ
参照じゃダメ?
139デフォルトの名無しさん
2021/05/31(月) 21:28:28.96ID:s2XLu44M
c++11やり始めた頃、for(auto& e:~やfor(const auto& e:~と出来るのを知らず、酷いコードを大量に垂れ流してしまったよ
140デフォルトの名無しさん
2021/05/31(月) 22:31:51.93ID:OyXVhXUR
>>138
参照にしてもfor文のスコープ外で宣言できた方が都合が良いことがままある
141デフォルトの名無しさん
2021/06/01(火) 01:12:38.27ID:reo3/Kbw
ループの最後の値を使いたいという事?
142デフォルトの名無しさん
2021/06/01(火) 09:11:18.08ID:qu3686ge
>>140
言っても「稀に」程度だろうし、やりたければスコープ外で宣言した変数に代入すれば済む。
何を問題としているのかわからない。
143デフォルトの名無しさん
2021/06/01(火) 12:18:45.46ID:GfvVYbqX
お漏らし推奨
144デフォルトの名無しさん
2021/06/01(火) 12:20:20.23ID:cpTyMADV
自作関数の引数を initializer_list にするのってなんか使い道あるんですか?
参照の組を渡せる?
145デフォルトの名無しさん
2021/06/01(火) 18:21:02.43ID:S9WvGpu9
MyVector v{1,2,3,4,5};
とかできる
146デフォルトの名無しさん
2021/06/01(火) 20:14:13.74ID:Y6fKUmaQ
ま、まいべくたーw
147デフォルトの名無しさん
2021/06/02(水) 06:27:13.91ID:P6q02jmG
>>145
コンストラクタの引数にするくらいしかメリットないの?
前スレ掘ってたら、同じ型の参照の組なら initializer_list で関数に投げれるってのを見つけたんだがそれはどうやんの
initializer_listを引数にとる関数 hoge を
hoge({fuga, var, aaa})
って呼び出したら実体を渡してることになるよね?
148デフォルトの名無しさん
2021/06/02(水) 06:48:10.69ID:2dvb28jp
MyVector(initializer_list<reference_wrapper<int>>) { }
149デフォルトの名無しさん
2021/06/02(水) 07:01:45.97ID:P6q02jmG
>>148
それって vector< reference_wrapper<T> > とは違うんけ?
150デフォルトの名無しさん
2021/06/02(水) 07:55:44.63ID:2dvb28jp
template <class T>をつけるならね
151デフォルトの名無しさん
2021/06/02(水) 07:57:13.92ID:2dvb28jp
reference_wrapperはC++11からでC++03にはないから> >にする意味ないぞ
152デフォルトの名無しさん
2021/06/02(水) 08:15:03.57ID:c6cNO3VA
初期化のときに登場する{}が初期化子リストだと言うことがつい最近判明した
概念を区分して分離したのが一番大きいので、用途についてはあまり考えられていない
153デフォルトの名無しさん
2021/06/02(水) 08:44:42.49ID:P6q02jmG
>>151
いや自分の可読性のためにそうしてるだけ
他の人にとってはそっちの方が見づらかったらすみません

それはそうと、関数に参照の組を渡すなら、initializer_list 云々というよりは reference_wrapper の組として渡すってことですね

もう一点、関数に initializer_list を渡すときって
・関数の引数の型が initializer_list である
よりも
・関数の引数のコンテナを initializer_list で初期化している
の方がしっくりくるんですが、前者で設計するメリットってありますか
154デフォルトの名無しさん
2021/06/02(水) 10:14:59.83ID:qtmfAhQ7
overloadに弱くなる
155デフォルトの名無しさん
2021/06/02(水) 10:21:56.66ID:2dvb28jp
>>153
長かったC++03時代でそういうクセが染みついちまった、ならわかる
156デフォルトの名無しさん
2021/06/02(水) 10:48:08.32ID:zppGp/iM
気狂いいてワロ
(a, b, c) と ( a, b, c ) さえどちらが良いかなんて誰にも決められないのに、なぜ < <> > と <<>> なら後者の方が問答無用で良いと思い込んでるのだろうか
こういう、一概には言えないことを押し付けるタチの異常者が回答側に回ってるのイタ過ぎだろ
157デフォルトの名無しさん
2021/06/02(水) 10:51:36.57ID:qtmfAhQ7
同和ンゴ
158はちみつ餃子 ◆8X2XSCHEME
2021/06/02(水) 11:11:42.37ID:Bcy6nIKX
トークン分割の段階では >> というひとつのトークンとして切り出された上で
構文解析の側で辻褄を合わせるという変な解釈が不格好だから好きじゃないな。
構文が複雑になる分には仕方がないと割り切れるんだが、
異なるレイヤをまたいで辻褄合わせするのってなんか嫌じゃない?

でもまあ > > よりは >> のほうが見やすい気がするからそう書いてるんだけど、
割とモヤモヤしがち。
159デフォルトの名無しさん
2021/06/02(水) 11:13:17.27ID:2dvb28jp
何で押しつけたことになるんだ?
被害妄想で攻撃的になるやつこそ病んでるぞ

スタイルは案件ごとにある
そこでいらぬ波風立てるやつは叩き出される
仕事は成果で語るものなのに勘違いして
つまらんことに気を取られるやつは使い物にならん
160デフォルトの名無しさん
2021/06/02(水) 11:41:07.35ID:vfPidZYU
>>149
おそらく初期化子リスト版の方が高速に動作する
まぁ、今時のコンパイラの最適化は変態レベルに進化してるから結局同じようなコードに落ち着くかもしれないけど
161デフォルトの名無しさん
2021/06/02(水) 11:54:53.84ID:P6q02jmG
>>154
initializer_list をとることにしておけばコンテナの種類を決めておく必要がないから得ってことですか?
162デフォルトの名無しさん
2021/06/02(水) 12:01:59.24ID:zppGp/iM
>>159
> スタイルは案件ごとにある
元質問はスタイルが指定された案件では全くないので、自分が頓珍漢なこと言ってたって認めるわけね

> そこでいらぬ波風立てるやつは叩き出される
> つまらんことに気を取られるやつは使い物にならん
狂おしいまでに己のことだな
163デフォルトの名無しさん
2021/06/02(水) 12:11:17.92ID:2dvb28jp
>>162
元質問には特定の案件か否かはどちらとも書いていないね
さらに俺は特定の案件の話だともそうでないとも言ってない

次から次へと勝手に決めつける軽率なやつが
他人に向かって頓珍漢とか天に唾するってやつだぜ
164デフォルトの名無しさん
2021/06/02(水) 12:24:56.03ID:e/VYBb4b
恥ずかしくなってネタっぽくしてるが隠しきれてない同和ンゴ
165デフォルトの名無しさん
2021/06/04(金) 15:31:20.39ID:Lunsq3fv
cout と cerr に同じもん流し込みたいときって
cout << hoge;
cerr << hoge;
ってやるしかない?
一行というか一文で書けたら楽だが
166デフォルトの名無しさん
2021/06/04(金) 15:57:51.35ID:xvizFE5L
>>165
すなおに以下のようなマクロにしとけばどうかな
#define HOGE(x) std::cout << x; std::cerr << x;
例えば以下のように使う
HOGE(hoge << endl);
167デフォルトの名無しさん
2021/06/04(金) 17:29:57.12ID:7u0nl5aT
random_device{}();
の中括弧って何なん
デフォルトコンストラクタで構築するってこと?
なんで丸括弧じゃないん
168デフォルトの名無しさん
2021/06/04(金) 18:26:04.60ID:XeNJRf+j
別に中()でも問題なくない?
169デフォルトの名無しさん
2021/06/05(土) 05:37:22.25ID:Fi/fLauk
ラムダ式のキャプチャ構文の個別コピーとか個別参照がなんで存在するのかイミフなんだが
引数で良いじゃん
170デフォルトの名無しさん
2021/06/05(土) 07:13:07.04ID:RvyziTet
キャプチャにもコストは掛かるから必要なものだけ最小限キャプチャしたい時に必要なんだよ
なぜ引数でいいと思うのかはイミフ
171デフォルトの名無しさん
2021/06/05(土) 07:24:52.28ID:qiBnX5wX
既存の関数ポインタや関数オブジェクトと整合性を取るには、寿命やスコープの異なる変数を使うための仕組み(キャプチャ)が必要だったからでしょ
172デフォルトの名無しさん
2021/06/05(土) 07:29:08.22ID:qiBnX5wX
とあるラムダ式を読みづらいと感じるならそこでは使わないほうがいい
煽っているわけではなくて、ラムダ式の存在意義は可読性の改善なので、ラムダ式を読みづらいのは本末転倒だからね
173デフォルトの名無しさん
2021/06/05(土) 07:39:00.13ID:ywjQFJII
>>170
キャプチャデフォルトにしても使わなかったやつはキャプチャされないから
あえて個別にするのは何か理由があるときだね
174デフォルトの名無しさん
2021/06/05(土) 08:28:34.32ID:NuQvqfvD
>>170
キャプチャできるオブジェクトってみんな引数としても渡せるじゃん
参照、const参照、コピーも自由自在だし
コストって言うけど、参照キャプチャと参照渡し、コピーキャプチャとコピー渡しってコスト違うの?

一応断っておくと[&]と[=]の存在意義は分かる
オブジェクトを個別にキャプチャするのがイミフってだけ
「こういうときに使う。引数渡しではできない」という例があったら教えていただきたいです
175デフォルトの名無しさん
2021/06/05(土) 08:43:36.40ID:hPuZ+cGi
ラムダ式がキャプチャするタイミングと呼び出すタイミングは違ってもいい
176デフォルトの名無しさん
2021/06/05(土) 08:53:12.54ID:qiBnX5wX
呼び出し時にキャプチャ元の存在は保証されない自己責任
177デフォルトの名無しさん
2021/06/05(土) 09:10:01.93ID:ywjQFJII
>>174
これを引数渡しではどう書く?

random_device dev;
int ary[256];
generate(begin(ary), end(ary), [&]{ return dev(); });
178デフォルトの名無しさん
2021/06/05(土) 09:10:44.09ID:S25kPsaU
>>175
なるほど
コピーしたいけど呼び出しの度には嫌だ、というときに役立つのか
神機能だな
179デフォルトの名無しさん
2021/06/05(土) 09:11:42.81ID:S25kPsaU
>>177
もう解決しました
180デフォルトの名無しさん
2021/06/05(土) 09:21:58.27ID:tBDt+1bH
>>176
コピーならHOSYOUされる

>>178
つか新しい関数を作る機能

>>169
カリー化
181デフォルトの名無しさん
2021/06/05(土) 09:28:59.14ID:tBDt+1bH
普通のキャプチャ(コピー)ではなくて
異常なキャプチャ(参照のキャプチャ)なら呼び出し時にキャプチャ元(参照されているオブジェクト)
の存在はHOSYOUされないから注意しないとKIKENだが
なんでそんな機能があるのかというとオブジェクトをカリー化(?)する場合にあったら便利だねえ、ぐらいの勢いの話
普通のキャプチャだけでもポインタをキャプチャしたら同じことができる
182デフォルトの名無しさん
2021/06/05(土) 09:37:27.71ID:tBDt+1bH
もっとも、自動変数として作られたオブジェクトxをキャプチャする場合、
xを参照のキャプチャする代わりに&xを普通のキャプチャしてしまうと
(「&」演算子が使われたことにより)微
妙に最適化に響きかねない問題というのは微妙にあるが微妙なので普通は気にするほどではないはず……
183デフォルトの名無しさん
2021/06/05(土) 09:53:54.69ID:qiBnX5wX
元のデータをFUCKYUできないような書き方はAUTO
184デフォルトの名無しさん
2021/06/05(土) 10:05:44.68ID:ywjQFJII
キモい言葉遣いヤメレ
185◆QZaw55cn4c
2021/06/05(土) 15:25:47.75ID:CJl2tIqC
ヒドロキシクルルキン
イベルメクチン
186◆QZaw55cn4c
2021/06/05(土) 15:26:27.50ID:CJl2tIqC
ヒドロキシクロロキン
イベルメクチン
187デフォルトの名無しさん
2021/06/05(土) 16:15:28.53ID:ftrSVS/I
C++において関数は第一級オブジェクト
なのに C++ が関数型プログラミングを全く想定していない仕様に思えるのはなぜ
188デフォルトの名無しさん
2021/06/05(土) 16:15:54.58ID:ftrSVS/I
関数型のパラダイムもうまく取り込んでほしい
189デフォルトの名無しさん
2021/06/05(土) 16:34:45.82ID:Cv4CPRao
>>187 古いから。
>>188 提案するのは自由だから、がんばって。
190デフォルトの名無しさん
2021/06/05(土) 16:53:27.35ID:KLv4XYoF
>>187
c++の関数は第一級オブジェクトじゃないだろ。
高階プログラムはテンプレートという別の仕組みでサポートしている。
191デフォルトの名無しさん
2021/06/05(土) 18:54:44.68ID:V38nFCWr
関数型プログラミングは別に古くないはず……
GENJITSU世界が状態を持ち破壊的代入を伴うから
まだチューリングマシン的な計算モデルの方が対応がとりやすい(気がする)だけ
C/C++が関数型プログラミング一本鎗にならないのはそれが根本原因
192デフォルトの名無しさん
2021/06/05(土) 20:10:51.62ID:rl6U/q41
・弱体化された関数型の機能
・構造化プログラミング
・GOTO文
これがCだよ

で、多分70年代当時は関数型プログラミングはおそらく過去の遺物になってた
でないとこの頃のlispの失速が説明つかない
193デフォルトの名無しさん
2021/06/05(土) 20:22:19.29ID:RvyziTet
当時生まれてないけど
あのマシン性能が貧相な時代によくLISPなんて流行ってたな
194デフォルトの名無しさん
2021/06/05(土) 20:31:42.60ID:lZ3sFmcT
むしろマシンリソースが少ない時代だからこそ流行したといえる
LISPマシンはすなわちスタックマシンだ
複雑な語句パーサーとツリー構造の構築がなくても、ストリームから
はいってきたキーワードを順繰りに解釈してスタックにつんでいき
かっこが閉じたらスタックからひっぱればちゃんと動くものがつくれる
195デフォルトの名無しさん
2021/06/05(土) 20:53:06.54ID:ywjQFJII
>>190
禿は「第一級オブジェクト」をテンポラリでないオブジェクトと言っているようだが
196デフォルトの名無しさん
2021/06/05(土) 21:21:58.41ID:XO/wZGzq
権威者がこれこれと言ってたからこれこれであるという話の持って行き方は
今日の世界では小学生レベルの人間しかしない

中世ヨーロッパでは過去の偉人の言葉をいかにうまく引くかが議論の上手下手を左右したらしいが
197デフォルトの名無しさん
2021/06/05(土) 21:28:06.29ID:ywjQFJII
その世界の教祖のような人でも一切、言葉を引いてはいけないのか
小学生で年収1000越えそうな人ってジュジュちゃんとかいるけど
自分の年収を棚に上げてわかったようなことをw
198デフォルトの名無しさん
2021/06/05(土) 22:00:37.95ID:ECg4taz5
>>194
それForthじゃね?
199はちみつ餃子 ◆8X2XSCHEME
2021/06/05(土) 22:00:51.75ID:G0EcoOQC
>>196
ここで必要なのは範例ではなく定義。
何が正しいのかを議論したいわけじゃなくてどの定義を使う「ことにする」という擦り合わせ。
C++ における定義を決めるなら設計者の言を元にするのは妥当だろ。

それはそれとして >>195 はなんかおかしいこと言っていると思うし、
なんか勘違いしてそうな気がするが。
200デフォルトの名無しさん
2021/06/05(土) 22:49:20.33ID:V38nFCWr
関数型プログラミングが古いと主張する香具師は
MVCとかなMと表示等が分離した設計モデルでありかつ
Mがマルチスレッド(UIスレッドとは別)なケースのプログラミングを
ラムダ式を使わずにして見られれば宜しい
すっきり収拾をつけるにはコールバック関数として関数オブジェクトを渡すか、
コールバック関数をvoid*引数の関数にするという前近代的な設計にするかしかなく、
classを使って手で書く関数オブジェクトはラムダ式を見たコンパイラが生成するコードと大差ないから
前者は関数型プログラミングに他ならない
という印象、
※ 個人の感想です

それはそれとして>>192も相当おかしいことを言っていると思うし以下略
201デフォルトの名無しさん
2021/06/05(土) 23:04:19.70ID:V38nFCWr
Promiseを使っても同じことで、
ていうかPromiseこそあるスレッドXを実行後に行うべき処理を行う関数Fを
スレッドXの終了後に実行するために(※1)内部で作っておくのだから関数型プログラミングに他ならない
関数型プログラミングパラダイムは全世界をあまねくみそなわしておられる、

※1: 実行する、というといかにも命令型プログラミングな感じだが、
   関数型プログラミングパラダイム的には関数Fを展開することで計算を遂行する、と解釈されたい
202デフォルトの名無しさん
2021/06/05(土) 23:25:00.00ID:XO/wZGzq
>>197
年収が人間の価値だと思う人って今でもいるんだね
203デフォルトの名無しさん
2021/06/05(土) 23:41:37.67ID:L7L31nHe
関数型の実戦で使えるエッセンスは10年前から各種人気の言語で取り込まれ、
具にも付かない思想倒れな部分は取り込まれなかった。それだけ。
204デフォルトの名無しさん
2021/06/05(土) 23:54:03.24ID:YIeCSJoh
>>196
上下を左右するとな。
今日一番心に残った表現だ。
205はちみつ餃子 ◆8X2XSCHEME
2021/06/06(日) 02:06:47.21ID:KdK5uVMj
Scheme だとプログラムの流れ (関数を呼出したり戻ってきたり) を継続の起動の連鎖として
定義づけているが、継続の概念の元になったのは並列計算の研究から生まれたアクター。
アクターにメッセージを送るのと関数呼出しが実装上は同じになってしまったという気づきから継続の概念へと整理されていった。

関数型とオブジェクト指向は整理の仕方が違うだけで
(といっても人間が使う以上はどのようなメタファで整理されているかも大事でもあるんだけど)
より抽象的なレベルで見ると同じことをやっている。
そんで並列計算は (理論上は) どっちでも織り込み済みなのでパラダイムによって
どちらのほうが並列計算しやすいということもない。

差があるとしたら単に言語の設計の出来栄えとかライブラリの整備とかのレベルの話なんで、
パラダイムにまで踏み込んで考えるような話じゃないよ。
206デフォルトの名無しさん
2021/06/06(日) 07:44:49.65ID:uVO5juz1
高所得者「年収が人間の価値だと思う人って今でもいるんだね」
低所得者「年収が人間の価値だと思う人って今でもいるんだね」
207デフォルトの名無しさん
2021/06/06(日) 08:33:32.64ID:MV541K/D
>>203
C++に取り込まれた、実践で使える関数型のエッセンスってどんなん
208デフォルトの名無しさん
2021/06/06(日) 08:36:03.93ID:xXlGkHu+
bind
209デフォルトの名無しさん
2021/06/06(日) 10:44:07.49ID:+heRuwS3
深さが任意の入れ子の vector を一次元 vector に展開したいんですが、良いやり方ありますか
再帰すれば良いと思うんですがどういう条件で分岐すれば良いかわかりません
210デフォルトの名無しさん
2021/06/06(日) 11:34:06.74ID:5eq/ZHJS
入れ子を一階層だけ展開する処理を書いて
入れ子がなくなるまで末尾再起するというのはどうだろうか
211デフォルトの名無しさん
2021/06/06(日) 11:37:51.02ID:+heRuwS3
>>210
今見てる階層の一個下がvectorか値かっていうのはどう判定したら良いですかね?
212デフォルトの名無しさん
2021/06/06(日) 11:56:07.70ID:W7O34OA1
>>209
これ

flatten - 1.57.0
https://www.boost.org/doc/libs/1_57_0/libs/fusion/doc/html/fusion/algorithm/transformation/functions/flatten.html
213デフォルトの名無しさん
2021/06/06(日) 12:00:46.49ID:W7O34OA1
大抵の言語でその手の挙動はflattenと呼ばれてる

Yet Another Common Lisp Problems
http://www.nct9.ne.jp/m_hiroi/clisp/yaclp03.html#ans51
214デフォルトの名無しさん
2021/06/07(月) 08:16:50.61ID:we1Omxer
>>197
肝心なのは「誰が言ったか」ではなくて、「(言った)意味、中身」。

さもないと「権威に訴える論証」にひっかかるから気をつけな。
わかってやっているなら詐欺師だし。
215デフォルトの名無しさん
2021/06/07(月) 09:33:53.85ID:3qfiWg/V
>>210
ちょっとググった感じだと、vector<T> が vector かどうか判定する is_vector ってないんですね
あと is_array は std::array を array と見なさないみたいな情報もあって、メタ関数は罠というか勘違いが多そうで怖いですね

現状、自分で is_vector を実装するしかないんですかね?
ごく基本的な処理に思えるので、シンプルな解法というかイディオムみたいのがあれば教えていただきたいです


>>212
ありがとうございます。が、今は自分で書くならどうなるかというところに興味があります
boost の flatten のコードはいろんな場合に対応するべく難解になっていそうですが、どうにもならなかったら参照してみます
216デフォルトの名無しさん
2021/06/07(月) 09:55:32.64ID:BbDyCKOj
>>215
正直、まず>209の「深さが任意の入れ子の vector」をどう定義してるのか見せてもらわないと話が見えてこない気がする。
要素型が固定なら要素型のほうで判定すれば is_vector は要らないだろうし、
variant とか使ってる場合もやっぱり is_vector の出番は無いだろうし。
217デフォルトの名無しさん
2021/06/07(月) 10:34:55.50ID:RKkN9u5/
>>216
vector< vector< ... vector<T> > ... > で、T は correction (vector, array 等) じゃない、というのを想定しています
仮定が足りませんでしょうか
218デフォルトの名無しさん
2021/06/07(月) 10:44:19.30ID:OrLbPX6K
>>214
偉そうにキリるなら「第一級オブジェクト」の公式な定義をまず出せ
219デフォルトの名無しさん
2021/06/07(月) 10:49:36.03ID:OrLbPX6K
>>215
作るったって大した話じゃねえべ

template <template<class...> class T> struct is_vector : false_type { };
template <> struct is_vector<vector> : true_type { };

template <template<class...> class T> constexpr bool is_vector_v = is_vector<T>::value;
220デフォルトの名無しさん
2021/06/07(月) 10:54:39.46ID:BLDePS2Q
>>217
numpy の reshape / flatten / ravel みたいなの想定してる?
221デフォルトの名無しさん
2021/06/07(月) 11:00:59.34ID:BbDyCKOj
>>217
それじゃ深さ固定じゃね?・・・深さの違ういくつかのケースを扱うっていうことか。
T を受け取るオーバーロードとそれ以外を受け取るオーバーロード書けばおしまいな気がする。
222デフォルトの名無しさん
2021/06/07(月) 11:02:02.86ID:BbDyCKOj
(要素ごとに深さが異なることもあるのを想定してた。)
223デフォルトの名無しさん
2021/06/07(月) 11:12:04.97ID:3qfiWg/V
>>219
ありがとうございます
よく知らない構文も混ざってるので、勉強します


>>220
はい
flatten をしたいです


>>221
template<class T> T flatten(vector<T>)

template<class T> T flatten(T)
ってことじゃないですよね?


>>222
>>217ってそれ含みませんっけ?
224デフォルトの名無しさん
2021/06/07(月) 11:14:17.08ID:3qfiWg/V
そもそも厳密な書き方じゃないので、含むか含まないかわかりませんね
今は含まないということにします
225デフォルトの名無しさん
2021/06/07(月) 11:59:15.70ID:0mm9pDbq
>>218
そもそもc++には「第一級オブジェクト」なんて定義されてないだろ。
c++標準に"first-class object" なんて記載あったかね。

一般的な解釈はwikipediaでも勉強しろよ。
226デフォルトの名無しさん
2021/06/07(月) 12:01:22.38ID:OrLbPX6K
>>225
ここはC++スレだ
一般的な解釈なんて頓珍漢なこと言ってんな
そっちへ逃げたければ1人で逃げろ
俺は付き合ってやんね
227デフォルトの名無しさん
2021/06/07(月) 12:05:00.74ID:0mm9pDbq
>>226
だったら「第一級オブジェクト」なんて頓珍漢なこと言ってんな
そっちへ逃げたければ1人で逃げろ
俺は付き合ってやんね
228デフォルトの名無しさん
2021/06/07(月) 12:08:12.54ID:OrLbPX6K
>>227
流れくらい読めよ
第一級オブジェクトと言ったのは>>187だぞ
おまえ他人に頓珍漢なんて言う資格ねえぞ
229デフォルトの名無しさん
2021/06/07(月) 12:28:32.41ID:5RAm1+EE
一昨日の曖昧イキリで今さらヒートアップしてんじゃねー
230デフォルトの名無しさん
2021/06/07(月) 12:36:56.22ID:0/HU77Xe
>187、>190 、>195 、>197、>214
の流れくらい読めよ
禿の権威にかこつけて「第一級オブジェクト」を主張しているのは>>195 >>197だぞ。俺はそれに>>214で反論しているだけで「第一級オブジェクト」は肯定していない。

おまえ他人に頓珍漢なんて言う資格ねえぞ
231デフォルトの名無しさん
2021/06/07(月) 12:44:36.71ID:OrLbPX6K
>>230
おまえの定義では斜め上な返事のことを反論というのか

関数は第一級オブジェクトか否かで揉めてるところへ
禿の定義を参考に持ち出したところへ
権威主義がどうたらと人格批判を始めたのが反論とは笑止千万
だから頓珍漢と言ってやったら相手の言葉をオウム返しし初めやがって
いくら寂しいからってプログラム技術板で全然技術的でない絡み方してんなよ
232デフォルトの名無しさん
2021/06/07(月) 12:48:56.88ID:x1bKzWtQ
流れ一切読んでないけどFirst-class citizenのことを言いたかったのかなw
233デフォルトの名無しさん
2021/06/07(月) 12:49:49.89ID:RKkN9u5/
こいつ「天に唾する」クンでしょ
>>219もコピペでドヤってるし
234デフォルトの名無しさん
2021/06/07(月) 12:51:26.64ID:OrLbPX6K
>>233
失礼な奴だな
オリジナルだよ
コピペじゃねえよ
他で同じもん作ったやつがいたの?
知るかそんなん
235デフォルトの名無しさん
2021/06/07(月) 12:52:10.37ID:0/HU77Xe
>>231
日本語でok
236デフォルトの名無しさん
2021/06/07(月) 13:04:49.21ID:OrLbPX6K
>>235
無教養なやつだな、まあいいけど
犬を相手に話したことが通じてなくても別に構わんのと同じだ
237デフォルトの名無しさん
2021/06/07(月) 14:29:25.71ID:OrLbPX6K
あの程度のコードをコピペだと思ってしまうあたり
自分では書けないやつなんだろうな
だとしたらプログラム技術板では最下層のゴミだ
238デフォルトの名無しさん
2021/06/07(月) 14:43:17.86ID:Tp4rg2N9
効きまくりでクソワロ
239デフォルトの名無しさん
2021/06/07(月) 14:45:04.77ID:8yb86Hta
5hは初めてか?肩の力抜けよ。

「第一級オブジェクト」についてはこんな感じだな。間違っていたら解説してくれ。
・c++では「第一級オブジェクト」は定義されていない
・c++では関数はオブジェクトじゃないし、オブジェクトとして扱うこともできないので、c++の関数をwikipediaにあるような解釈で「第一級オブジェクト」と言うことはできない
・関数を操作対象として(メタ)プログラムする仕組み(テンプレートとか関数オブジェクト・ラムダ式)があるので、高階プログラム自体は可能
240デフォルトの名無しさん
2021/06/07(月) 14:57:20.33ID:3ylBisjG
第一級オブジェクト、よくイキりのWEBプログラム屋が使う印象の単語
C++界隈ではあんまり聞かん単語だな、使わないことはないが
241デフォルトの名無しさん
2021/06/07(月) 15:02:43.23ID:JV8K97H/
std::functionで「第一級オブジェクト」とやらに出来ることは何でも出来るからそれで充分であって
そっから先はただの宗教戦争だろ
242デフォルトの名無しさん
2021/06/07(月) 15:10:41.88ID:pl6618+T
第一級市民オブジェクト

フランス革命で殺されたかも?
243デフォルトの名無しさん
2021/06/07(月) 15:32:32.79ID:Tp4rg2N9
>>241
> std::functionで「第一級オブジェクト」とやらに出来ることは何でも出来る

俺も完全にこれの話だと思ってた
244デフォルトの名無しさん
2021/06/07(月) 15:35:57.19ID:Tp4rg2N9
ただ純粋関数型言語のようには書きたくても書けないよね、というのが>>187-188の話だと
245デフォルトの名無しさん
2021/06/07(月) 15:38:30.60ID:OrLbPX6K
>>238
は? 尻尾巻いて逃げた負け犬の分際で何か言ったか?
246デフォルトの名無しさん
2021/06/07(月) 15:41:28.23ID:Tp4rg2N9
つーか
> 「天に唾する」クン
なのは図星なのかよって思うとまたワロタ
247デフォルトの名無しさん
2021/06/07(月) 16:02:18.11ID:OrLbPX6K
>>246
そんなとこ見てねえよ

コピペ呼ばわりから逃げたいのか?
吐いた唾は飲ませんぞ、自分で書けない低脳が
248デフォルトの名無しさん
2021/06/07(月) 16:40:25.13ID:8yb86Hta
>>241
まあ、c++は歴史が長いから、他人には禁止したい余計な機能はあるよなぁ。

以前、ユーザー側からどうやってもdeleteできないスマートポインタを作ろうとしたけど、どうしても::deleteをブロックできなくて挫折した。……まあ、::delete使うやつはいないだろうけど。
あと、オブジェクトのライフサイクル制限を目的としてヒープに置けない(スタックだけに置ける)クラスを作ろうとしたけど、メンバ変数に置くのをブロックできなくて挫折した。
249デフォルトの名無しさん
2021/06/08(火) 10:43:30.63ID:x/Of6Ttl
そういうしょうもない機能作ることに時間をかけるくらいならバカを雇わない方がよっぽど生産的だわ
250デフォルトの名無しさん
2021/06/08(火) 11:14:53.81ID:50eCybWC
しょうもないかねえ
俺は技術的に色んなことを想像したぞ
251デフォルトの名無しさん
2021/06/08(火) 11:37:14.14ID:x/Of6Ttl
しょうもないわ。
注目するのはなぜdeleteしようとしてんの?ってとこでしょ。
それを無理に禁止してもそいつはもっとめちゃくちゃなことするぞ。
252デフォルトの名無しさん
2021/06/08(火) 11:46:10.34ID:50eCybWC
しょうもないことにしたいやつは考えること自体を拒否するから
相手すんの馬鹿らしいわ
253デフォルトの名無しさん
2021/06/08(火) 14:05:51.36ID:8EXn3XTK
自分も昔似たようなこと考えたことはあったけど
operator->()を実装する限り、直接呼び出しでナマポ取られちゃうのを防ぐ方法がないんだよな
しょうもないことは否定しない
254デフォルトの名無しさん
2021/06/08(火) 14:21:31.17ID:xXU8pzBk
すぐには実用的な用途は思いつかないからしょうもないかどうかは判断できないけどパズルみたいなもんで趣味としてやるならいいんじゃね?
255デフォルトの名無しさん
2021/06/08(火) 14:23:46.24ID:eGG/8TZ/
自分で使う分には全然問題ないんだけどな。他人が絡むとマーフィーの法則が恐ろしい。
パラノイアなのは否定しない。
256デフォルトの名無しさん
2021/06/08(火) 14:55:17.86ID:RogQNf7Q
旅行バッグに荷物をきっちりと詰めてから荷物の入れ忘れに気づく徒労感を楽しみたい人だけやればいい
257デフォルトの名無しさん
2021/06/08(火) 15:32:28.52ID:50eCybWC
ピンプってる場合だってクラックはやればできる
そういうのまで完璧にガードするのか否かで考え方変わってくるからな
258デフォルトの名無しさん
2021/06/09(水) 07:49:45.61ID:ZYaksnCf
標準にだって「禁止」や「非推奨」はあるね
259デフォルトの名無しさん
2021/06/09(水) 18:54:04.56ID:N9xjQvrw
autoでなにか受けるときに、参照を使う方がユニバーサル参照を使うより良い場合ってある?
260デフォルトの名無しさん
2021/06/09(水) 21:30:11.98ID:QYfnOwKH
const参照であればいい場合もあると思う。
261デフォルトの名無しさん
2021/06/09(水) 22:33:15.24ID:9teK4oYw
>>260
ホワァイ?
262デフォルトの名無しさん
2021/06/10(木) 06:52:19.94ID:Wg8t0Pwp
規格票を検索してもuniversal referenceというフレーズはヒットしない
263デフォルトの名無しさん
2021/06/10(木) 07:54:30.31ID:795Q5O5L
もともと名前がなかったので、通称としてuniversal referenceとかforward referenceとか呼ばれるようになったんよ
264デフォルトの名無しさん
2021/06/10(木) 10:15:03.53ID:p1gVn+om
>>262 forwarding reference でどうぞ。
265デフォルトの名無しさん
2021/06/10(木) 14:55:46.69ID:QNK25992
std::vector<A>を、std::vector<B>を使ってソートしたい場合
どうするのがスマートでしょうか?
例えばAが生徒の名前、Bがその生徒の得点だとして・・・
struct C{A a; B b;}を定義してvector<C>を作ってそれの比較演算子を作って・・・というのは思いつきますが
もっといいやり方ってありますかね?
266デフォルトの名無しさん
2021/06/10(木) 15:02:18.84ID:Wg8t0Pwp
名前、得点の他に何か、たとえば出席番号や出席日数などがあるなら
名前と得点だけのstruct C { A a; B b; }; を作るのは得策じゃなさそうだな
全てのデータが載ったマスターデータを作っておいて、
そのレコードへのポインタでvectorなり何なり作ってソートしては?
267デフォルトの名無しさん
2021/06/10(木) 17:03:39.84ID:PlM5zQeB
vector<C>みたいなものを作りたくないならAとBのvectorの要素間の対応関係はどうやって守るつもりなの?
片方だけソートしたら壊れちゃうぞ
元データは触らずにindexのvectorを別に用意して、[](int x, int y){return b[a] < b[y];} でソートする手もあるけど
268デフォルトの名無しさん
2021/06/10(木) 17:04:25.52ID:RDo2P64U
>>260
割となんでか気になるので、よかったら教えてください
269デフォルトの名無しさん
2021/06/10(木) 17:16:00.08ID:cpOseG3V
多次元配列の in-place な添字の入れ替え (transpose) って上手いやり方知られてますか?
多次元配列の各要素は一次元に配置されてると仮定して良いです (行優先でも列優先でも良いです)
270デフォルトの名無しさん
2021/06/10(木) 19:01:36.72ID:QNK25992
>>266-267
ありがとうございます
とりあえず要素そのものじゃなくポインタかインデックスでやれば良いことに気づけました

>>267 >片方だけソートしたら
両方ソートするイメージでした
271デフォルトの名無しさん
2021/06/10(木) 20:38:48.11ID:Cfq+H/IQ
>>269
縦横の二重ループで一つずつswapするしかないんじゃないかなー
gslやgmtlはそうなってた
272デフォルトの名無しさん
2021/06/10(木) 21:10:03.36ID:cpOseG3V
>>271
行列で言うと、上三角あるいは下三角の各要素を巡回して対応する要素と swap するみたいなことですよね?

多次元の場合も同じようにできますかね?
例えば3次元配列だったら、直方体を斜めに切って上三角錐か下三角錐の各要素を巡回するって理解で合ってますでしょうか
273デフォルトの名無しさん
2021/06/11(金) 11:50:48.69ID:6MS9qCPq
CMakeについてもこのスレでいいの?
274デフォルトの名無しさん
2021/06/11(金) 12:12:28.01ID:lhS8myn8
ちょっと違うね
スレないんなら立てたら?
275デフォルトの名無しさん
2021/06/11(金) 15:24:20.00ID:6w8Pdydz
スレ検索したらmakeスレなんて無いんだな
確かにここ10年位makefileなんて書いたことないけど…
276デフォルトの名無しさん
2021/06/11(金) 17:20:45.97ID:6MS9qCPq
VSCodeで書く時は便利なんで・・・
277デフォルトの名無しさん
2021/06/12(土) 18:33:47.62ID:ghBnzS2R
過去に
make 使ったら負け
ってスレがあった
278デフォルトの名無しさん
2021/06/12(土) 18:44:06.98ID:uNQxUpm0
まあ今どきMakefileなんて人間様が書くもんじゃないし
279◆QZaw55cn4c
2021/06/12(土) 20:02:28.17ID:bG62sF4n
>>278
え?
280デフォルトの名無しさん
2021/06/12(土) 20:28:22.70ID:uNQxUpm0
え?
281蟻人間 ◆T6xkBnTXz7B0
2021/06/12(土) 20:35:26.24ID:bymgAWyc
立ててみた。活用してね。

ビルド自動化ツールCMake Part.1
http://2chb.net/r/tech/1623496111/
282デフォルトの名無しさん
2021/06/12(土) 20:57:53.25ID:1iQypGIZ
cmakeってすごいよね
Makefile作れるだけかと思ってたらVisual Studioのソリューションファイルなんかも生成できて驚いた
283蟻人間 ◆T6xkBnTXz7B0
2021/06/12(土) 21:13:38.88ID:bymgAWyc
>>282
CMakeはGitHub Actionsと組み合わせると、ビルドとテストが自動化できて最強なんだよ。
コマンドラインで出来るめんどくさい仕事は自動化してほしいよね。
284デフォルトの名無しさん
2021/06/12(土) 21:40:08.27ID:sKjH8uh5
AutomakeもそううだがCMakeはなんでそんなことができるのか原理がわからん……
285デフォルトの名無しさん
2021/06/12(土) 21:43:46.98ID:txLE/1e4
mesonとかautotoolsとかのビルドツール共用でも良かったかな
286デフォルトの名無しさん
2021/06/12(土) 21:49:00.69ID:sKjH8uh5
ていうかそもそもVisual Studioのslnファイルの仕様とか公式に公開されていましたっけ
287蟻人間 ◆T6xkBnTXz7B0
2021/06/12(土) 21:52:27.12ID:bymgAWyc
>>286
中身見てごらん。テキストファイルだよ。
288デフォルトの名無しさん
2021/06/12(土) 22:04:02.95ID:o9BWFjAs
せっかくスレ作ったのにこちらで話してる
289デフォルトの名無しさん
2021/06/12(土) 22:05:38.91ID:sKjH8uh5
>中身見てごらん。テキストファイルだよ。
ヒエッ…、、、ブラックスワン理論…!
290デフォルトの名無しさん
2021/06/12(土) 22:06:14.61ID:Ap+0oKF5
バージョン変わるとすぐ壊れるがな。
dockerで環境揃えてmake使った方がよっぽど安定するわ。
291デフォルトの名無しさん
2021/06/12(土) 22:27:19.91ID:7X99TIl2
>>286
全部のタグを説明するリファレンスのようなものがあるかどうかは知らんけど、ある程度はドキュメント書かれているよ。
292デフォルトの名無しさん
2021/06/12(土) 22:33:32.97ID:gSM3EPqA
>>286
マイクロソフトってそう言うドキュメントは結構まめに公開してるよ
https://docs.microsoft.com/en-us/visualstudio/extensibility/internals/solution-dot-sln-file?view=vs-2019
293デフォルトの名無しさん
2021/06/12(土) 23:44:11.11ID:l5AvwX9O
M$にベンダーロックインされる。
294デフォルトの名無しさん
2021/06/13(日) 00:08:56.86ID:nx3q3d7E
sln作らなくても最近のVisualStudioは直接cmakeプロジェクト読めるぞ
295デフォルトの名無しさん
2021/06/13(日) 03:39:36.78ID:8vbdM5AU
新しいプロジェクトするならmesonを試したいなー
296デフォルトの名無しさん
2021/06/13(日) 10:14:32.44ID:exUpBE38
GYPには期待したんだがもう先がないな。
297デフォルトの名無しさん
2021/06/13(日) 13:41:01.17ID:NE9anLMi
メンバの構築 (コンストラクタの呼び出し) を後で行いたい
なんでこれしきのことができないんだろうか

「ポインタ使え」はナシね
これしきのことにポインタて笑って感じなんで
298デフォルトの名無しさん
2021/06/13(日) 13:44:02.04ID:5F9QidAB
C++では、デバッグモードと本番モードの切り替えってどうやるのが普通ですか?
今は、実行時に渡す環境変数で切り替えてます
299デフォルトの名無しさん
2021/06/13(日) 14:05:32.61ID:zIllxi6t
ビルド時にバイナリ自体を分けるのが多いような
300デフォルトの名無しさん
2021/06/13(日) 15:41:03.56ID:NZ4aFVGn
>>297
他の言語の多くは参照型がデフォなんだから、同じことをC++でやりたいのなら他の言語の参照型に相当するポインタを使うのは当たり前じゃん。
どうせポインタよく分からないとかスマポも知らずにポインタめんどくさいとか思ってるからポインタ使いたくないんでしょう?このスレで笑われるのは君の方だよ
301デフォルトの名無しさん
2021/06/13(日) 16:45:02.61ID:MMKkdcax
まあスマポが他の言語みたいにスマートでもなんでもないゴミみたいな記述法だからなw
302はちみつ餃子 ◆8X2XSCHEME
2021/06/13(日) 17:11:16.17ID:tRZIM+Qs
>>298
デバッグモードというのは具体的に何をするモードのことを言ってるの?
一般的に C++ 関連の用語として言うときのデバッグとリリースの違いはコンパイル時のプロジェクトを分けて
実行バイナリ自体が異なるものになるくのが普通だし、
Visual Studio とかを使ってたらリリース版とデバッグ版はそのように分かれるようになってる。

そういう運用の仕方についての質問ではなく、たとえば
「いざというときに現場でデバッグに使えるモードを仕込んでいるけど
 そのモードへの隠しスイッチはどうあるべき?」
みたいな切り替え方をどうすべきかだけの質問なのかな?

もしそうなら環境変数でもコマンドラインオプションでも自然だと思う。
303デフォルトの名無しさん
2021/06/13(日) 17:15:24.12ID:Ciq9mmv0
>>301
言語の成り立ちや目的が違うからな
そう思う人は他の言語を使えば良い
304デフォルトの名無しさん
2021/06/13(日) 17:23:14.98ID:exUpBE38
「スマート」がなんで「記述法」にかかるんだろう。記述法にそんなもんあるのか?
305デフォルトの名無しさん
2021/06/13(日) 17:33:42.92ID:nx3q3d7E
C++標準としては「NDEBUGマクロで切り替えろ」じゃないの
306デフォルトの名無しさん
2021/06/13(日) 17:58:03.62ID:y2s9578f
>>297 std::optional で。ポインタ使うのの何が嫌なのかわからないけど。
307デフォルトの名無しさん
2021/06/13(日) 17:58:55.99ID:y2s9578f
>>298 それで切り替えできてるならいいじゃないの。人の数だけある「普通」とかどうでもよくない?
308デフォルトの名無しさん
2021/06/13(日) 18:41:43.91ID:ZxtyD0qd
>>300
ポインタは参照型じゃなぁぁぁぁい!w
309はちみつ餃子 ◆8X2XSCHEME
2021/06/13(日) 18:42:59.35ID:tRZIM+Qs
>>308
だから「相当する」という語が付いてるんだろ?
310デフォルトの名無しさん
2021/06/13(日) 18:47:32.61ID:5F9QidAB
>>299,305,307
ありがとうございます
311デフォルトの名無しさん
2021/06/13(日) 19:00:04.06ID:cbxmrD1A
C++に関係したフォーラムや掲示板で、一番人が多いとこってどこですか?
海外のサイトでも可です

このスレで質問することも多いのですが、アルゴリズムに絡んだ質問だったりするとなかなか回答頂けないので
312デフォルトの名無しさん
2021/06/13(日) 19:51:51.12ID:4vlvBmrw
多次元配列の a[2][3][4] って記法、各次元の長さが x, y, z だとすると *(a + 2*y*z + 3*z + 4) を計算してるの?
意味的に一緒かというよりは、実際そういう実装になってるのか知りたいです

かけ算の数が小さくなる工夫みたいのってされてるんですか?
313蟻人間 ◆T6xkBnTXz7B0
2021/06/13(日) 20:00:41.15ID:otNLJkw4
>>312
CPUに合わせた最適化はされてるよ。例えばx86 CPUではメモリーアドレッシングという計算が得意。まあ、コンパイラが吐くアセンブリを見るといいよ。
314はちみつ餃子 ◆8X2XSCHEME
2021/06/13(日) 20:15:02.56ID:tRZIM+Qs
>>311
質問なら Stackoverflow とか Teratail とか。
315デフォルトの名無しさん
2021/06/13(日) 20:28:49.46ID:4vlvBmrw
>>313
ありがとうございます
> 多次元配列の a[2][3][4] って記法、各次元の長さが x, y, z だとすると *(a + 2*y*z + 3*z + 4) を計算してるの?
というのは大体どんな処理系でもそうで、
> かけ算の数が小さくなる工夫みたいのってされてるんですか?
ここは処理系による高速化がされてるということですね

つまり、大抵は
> 2*y*z + 3*z + 4
に相当する部分を自分で (書いた関数とかマクロで) 計算して a に加えるよりは、a[2][3][4] とアクセスする方が速いんですかね?
>>272の、多次元配列の添字の入れ替えを in-place でやりたいという話で、こういう疑問に行き当たりました
316はちみつ餃子 ◆8X2XSCHEME
2021/06/13(日) 20:44:32.87ID:tRZIM+Qs
>>315
それを自分で判断できない知識レベルならコンパイラに任せたほうが確実に良いよ。

「早すぎる最適化は諸悪の根源」とか「実測せよ」というよく知られた格言がある。
仮にちょっとした書き方で高速になるのだとしてもそれによって全体が読みにくいコードになってたら
改善するのが大変になって結果的にあまりよくないコードになってしまいがち。
処理速度が足りないのなら足を引っ張っているのはどこなのか
完成したプログラムを測定してから問題個所を改良すべきというのが先人の教え。
317蟻人間 ◆T6xkBnTXz7B0
2021/06/13(日) 20:51:49.27ID:otNLJkw4
>>315
どうやれば高速化するかは、実際のコードで実測とアセンブリみないと解析できない。掛け算の代わりに足し算で計算できる場合はそうした方が早いかもしれない。
x86 アセンブリの場合、MOD eax, [ecx+ebx*2]のように一語でアドレス参照できる場合がある。
高速化手法には、他にもSIMDもあるし、マルチスレッドもある。
318デフォルトの名無しさん
2021/06/13(日) 21:02:57.88ID:TY7uaTz0
>>297
C++11だとnewでメモリだけ最初に確保しといて、も一回 new で
そのメモリ指してコンストラクタ走らせるってやり方?
ポインタ遮蔽するような template書けば良さそうだけど。
319◆QZaw55cn4c
2021/06/13(日) 21:06:50.91ID:Ln9XBzss
>>308
イコールとはいいませんが、ニアリーイコール、同じようなものですよ‥‥
320デフォルトの名無しさん
2021/06/13(日) 21:08:32.23ID:Q2x3/Bx2
>>318
わざわざ自分で書かなくてもvectorがちょうどそんな動作してるよね
321デフォルトの名無しさん
2021/06/13(日) 21:43:42.51ID:4vlvBmrw
>>317
ありがとうございます

in-place だと
○ 作業用メモリが必要ない
○ 全要素の半分だけ一回ずつ訪れれば良い
☓ 要素アクセスは自分で書いた関数なりマクロなりで行う必要がある

out-place だと
☓ 作業用メモリが必要
☓ 作業用領域にコピーして元の配列に戻すので各要素を二回ずつ訪れる必要がある
○ 要素アクセスは高速

て感じなので、やってみてどっちが良いか決めます
322デフォルトの名無しさん
2021/06/13(日) 22:27:55.12ID:UWNgHhx2
俺がC++をこよなく愛する理由のひとつがとにかく長年の積み重ねのおかげで
コンパイラが激烈に賢いことだ
他の、たとえばJavaやらそれから派生したKotlinなんかでコード書いてて
「こんぐらいはコンパイラが最適化してくれるっしょ」とかルーズに書いて
実際に展開されたバイトコード見て絶望したことは数えきれない
323はちみつ餃子 ◆8X2XSCHEME
2021/06/13(日) 22:41:11.48ID:tRZIM+Qs
Java の場合は JVM の側で最適化したりするからバイトコードはそんなに頑張らないらしいよ。
324はちみつ餃子 ◆8X2XSCHEME
2021/06/14(月) 02:15:01.87ID:fvxG9/iR
makefile (GNU Make) の使い方の質問はどのスレで聞いたらよいんですかね?
325デフォルトの名無しさん
2021/06/14(月) 07:14:11.60ID:C+gz3c8V
>>297
普通に破門
おまえはポインタを使うなではなくC++を使うな
二度とこの世界に戻ってくるな
326デフォルトの名無しさん
2021/06/14(月) 08:03:40.16ID:nv+G1IlK
CMakeのスレ使えば?
327デフォルトの名無しさん
2021/06/14(月) 08:09:35.27ID:/kKjPBzj
>>297
誰もメリット感じないから実装しないんだろ。
ポインタに対するメリットは?
328デフォルトの名無しさん
2021/06/14(月) 08:35:37.07ID:wsn+oRmt
みなstd::unique_ptrを思いついているが質問の仕方が気に食わないのでわざと回答しない
329デフォルトの名無しさん
2021/06/14(月) 08:43:01.39ID:6p9bp5Dj
「これしきのことにポインタ」とか言ってるくらいだから>>297にとってポインタのハードルがものすごく高いんだろう。
330デフォルトの名無しさん
2021/06/14(月) 10:09:52.82ID:C+gz3c8V
331デフォルトの名無しさん
2021/06/14(月) 10:36:17.05ID:wsn+oRmt
そうは言っても、コンストラクタでしかプロパティ設定できない不親切なクラスを仕方なく使う羽目になることは結構あるでしょ
332デフォルトの名無しさん
2021/06/14(月) 10:44:09.11ID:FpnA+nhS
RAII分かってるならそもそもコンストラクタ呼び出した後に2phaseでメンバ構築やろうなんて思わないから、質問の意図がわかんねーんだよな
333デフォルトの名無しさん
2021/06/14(月) 11:25:21.25ID:LnG83xz5
>>290
++
334デフォルトの名無しさん
2021/06/14(月) 11:30:58.26ID:LnG83xz5
>>311
stackoverflow
335デフォルトの名無しさん
2021/06/14(月) 11:33:34.30ID:C+gz3c8V
> このスレで質問することも多いのですが、アルゴリズムに絡んだ質問だったりするとなかなか回答頂けないので

知ってるがお前の態度が気に入らない
というケースならいくつか思い当たるな
336デフォルトの名無しさん
2021/06/14(月) 11:36:44.15ID:LnG83xz5
>>312
>多次元配列の a[2][3][4] って記法、各次元の長さが x, y, z だとすると
> *(a + 2*y*z + 3*z + 4) を

*(a + 4 + (3 + 2*y)*z)
くらいのことはやってるよ
337デフォルトの名無しさん
2021/06/14(月) 11:40:50.95ID:LnG83xz5
>>315
そういう話ならいちいち掛け算してるかとかその回数がとかよりも
メモリキャッシュに乗ってるかどうかの効率の方が多きい
338はちみつ餃子 ◆8X2XSCHEME
2021/06/14(月) 17:34:14.74ID:fvxG9/iR
前後の命令の依存関係によっては多少高コストの演算でもパイプラインに隠れて全体としては
それほど時間がかからないということも有りうる。
命令ひとつの実行コストだけでは評価できないから結局のところやってみてから計測するのが
手っ取り早いって話になる。
339デフォルトの名無しさん
2021/06/14(月) 18:10:27.40ID:riVdj5/n
>>312
現代の普通のコンパイラであれば当然最適化が行われる

コンパイル時に決定可能な部分はコンパイル時に決定するし、
ループ内で変化がない部分はループの外で計算する
のが普通

a[i][j][k] で一番ループの内側がkであれば
a[i][j]まではループの外で行うし
a[1][2][k] のような固定値であればa[1][2]まではコンパイル時に計算する

メモリアクセス順は非常にパフォーマンス的には重要で
a[i][j][k] を3重ループでアクセスする場合
ループの外側からi,j,kとするべき

言語上のいわゆる配列は最適化されやすいので普通は気にしなくていいが、
vectorやMatなど、外部定義の [] は基本的には遅いと思っていい

コストが小さいとはいっても確実にコストは発生する
速度が非常に重要な場合では
SIMD化、キャッシュ化、ループアンロールなどで最適化すべき
その場合も、データ構造、アクセス順、アルゴリズムなど上位層の最適化が終わってから
340デフォルトの名無しさん
2021/06/14(月) 22:36:37.28ID:VOy4fGQR
vectorの[]だって配列へのアクセスしかしてないけどな。
インライン展開されるし範囲チェックもしてない
341デフォルトの名無しさん
2021/06/14(月) 23:49:54.30ID:4pDx/Jk6
素人質問ですみません
クラスのメンバ関数は常に外で実装しますか?それとも、短いものはクラス宣言内に書きますか?
混在させて良いものかと迷っています(クラス宣言内に書くとinline指定になる事は知っています
342はちみつ餃子 ◆8X2XSCHEME
2021/06/15(火) 00:02:19.94ID:t/bAz/vZ
>>341
どっちでもいいようになっているんだからどっちにするかは個別の判断による。
具体的条件を示してくれたらどちらが好ましいかの意見は言えるよ。
343デフォルトの名無しさん
2021/06/15(火) 05:05:22.97ID:UNOhr6//
template<class T, size_t N> using myarray = std::array<T, 2*N>;
としたときに、関数 hoge を
template<class T, size_t N> void hoge(myarray<T, N>);

template<class T, size_t N> void hoge(array<T, N>);
でオーバーロードすることってできますか?
344デフォルトの名無しさん
2021/06/15(火) 05:32:07.52ID:d2euf9Bx
>>338
高コストという文言の意味がよくわからんが
レイテンシが大きい命令はパイプラインを乱すぞ
345デフォルトの名無しさん
2021/06/15(火) 05:35:15.36ID:d2euf9Bx
>>343
2番目のオーバーロード関数はarrayにstd::を付け忘れてるのか?
だとすると無理だと思うな

std::array<int, 1> a;
hoge(a);
と呼び出したとき、N==2となるべきかN==1となるべきかの根拠がないから

やってみてないけど
つーか、おまえさんはやってみたのか?
346デフォルトの名無しさん
2021/06/15(火) 05:40:17.26ID:UNOhr6//
>>345
> 2番目のオーバーロード関数はarrayにstd::を付け忘れてるのか?
すみません。そうです

まだ試してないです
無理そうだなって思うんですが、昔「オーバーロード関数は機械にとってはそれぞれ別名関数だ」って話を聞いて、じゃあもしかしたら行けるかもと思った次第です
347デフォルトの名無しさん
2021/06/15(火) 07:12:05.86ID:9e5Yrhbb
すぐ試せることを自分で試さずに5chで聞くの良くないよ
348デフォルトの名無しさん
2021/06/15(火) 07:54:52.19ID:rGBATnAZ
>>341
templateのクラス書いてると、長くても中に入れちゃうから、でかいのバーンって
そのままヘッダに入れても抵抗はないけど、templateでない場合でかい関数は普通に外に書くな。
349デフォルトの名無しさん
2021/06/15(火) 08:01:18.68ID:d2euf9Bx
>>341


templateやstaticのように実装をヘッダファイルに書く場合も
ヘッダファイルの中でプロトタイプと実装に分ける
さらに実装は別ファイルにしてヘッダファイル内で#includeする

宣言だけからなるアウトラインを残したいから
350デフォルトの名無しさん
2021/06/15(火) 08:19:37.29ID:UNOhr6//
>>343,345-347
試して無理でした
言い方合ってるかわかりませんが、>>343のやり方ではオーバーロードと関数テンプレートの差がないからでしょうか

コンパイラに myarray を array と別の型だと思ってもらって、hoge をオーバーロードするテクってありますでしょうか
351デフォルトの名無しさん
2021/06/15(火) 09:04:05.70ID:9e5Yrhbb
>>350
継承でいけるんじゃね
352はちみつ餃子 ◆8X2XSCHEME
2021/06/15(火) 09:47:07.09ID:t/bAz/vZ
>>350
using で作った別名と元の型を区別する方法があるかという意味でなら方法は無い。
using は「別名」を作っているだけであくまでも同じ存在。

オーバーロードできるように型を分ける方法があるかという意味でなら >>351 が提案しているように継承を使うのが簡単な方法。
template<class T, std::size_t N> class myarray : public std::array<T, 2*N> {};
みたいに書いて継承しつつ特になにも付け加えなければ事実上の別名でありつつ異なる型でもある。
353デフォルトの名無しさん
2021/06/15(火) 10:24:24.93ID:d2euf9Bx
template<class T, std::size_t N> class myarray : public std::array<T, 2*N> { using std::array::aray; };
コンストラクタも継承しとかないと使いにくくて困るぞ
354デフォルトの名無しさん
2021/06/15(火) 10:25:47.44ID:d2euf9Bx
std::array<T, 2*N>::arrayか
この件のみ動作確認しないポリシーなんでやりづれえ
355デフォルトの名無しさん
2021/06/15(火) 15:04:54.99ID:dTl1pSLY
>>349
迷惑なやつだな
356デフォルトの名無しさん
2021/06/15(火) 15:40:54.02ID:UNOhr6//
>>351,353-354
なるほど
ありがとうございます

> この件のみ動作確認しないポリシー
てどういういみでしたっけ?
357デフォルトの名無しさん
2021/06/15(火) 15:43:28.83ID:UNOhr6//
コンストラクタさえ継承しとけば、元のクラスとほぼ同じ使用感で使えるんですかね?
試しきれないので未知の困難に直面しそうで結構不安です
358デフォルトの名無しさん
2021/06/15(火) 15:44:46.76ID:d2euf9Bx
>>355
何が?
359デフォルトの名無しさん
2021/06/15(火) 16:21:53.57ID:9e5Yrhbb
>>356
多分、自分で確認もせず書き込むようなやつには同じく動作確認なんかしてやらねーよ、ってことだろ
360デフォルトの名無しさん
2021/06/15(火) 18:25:24.86ID:yoH1yiay
どうでもいいけど変数テンプレートの四則演算って推論の邪魔するような
361デフォルトの名無しさん
2021/06/15(火) 20:42:15.88ID:GdaBtgkC
>さらに実装は別ファイルにしてヘッダファイル内で#includeする
これはやりすぎだろ
#include先に何書いてるかわからんから結局読まなきゃならん
空行とコメントで上下に分ける方がマシ
362デフォルトの名無しさん
2021/06/15(火) 21:00:10.82ID:9e5Yrhbb
それは非テンプレートなクラスでも一緒だと思うけど
363デフォルトの名無しさん
2021/06/16(水) 06:00:46.73ID:KGe9Xsu1
>>361
その論法はヘッダファイルそのものを否定する考えだな
364361
2021/06/16(水) 21:17:19.71ID:vMisLWvQ
結局読まなきゃならないのは一緒だよ、当たり前
それでも、何か所にも同じのを書くのが嫌だから#includeなんじゃないの?
俺は一か所からのみ#includeするのを否定してる
365デフォルトの名無しさん
2021/06/17(木) 05:36:20.94ID:qVo1n1YK
何か所にも同じのを書くのが嫌なら
テンプレートでない関数をプロトタイプと実装に分けただけで難癖つけるのか?
366デフォルトの名無しさん
2021/06/17(木) 10:01:25.56ID:4N0CEvnv
まぁヘッダのインクルードの仕方はそれぞれだからなぁ
自作ヘッダ内では一切インクルードしない(それの前に必要なヘッダをすでにインクルードしてる前提)ってのもある

ただその戦略なら、テンプレートがインスタンス化される直前にその実装が書かれたやつインクルードすればいいだけなんだが
367デフォルトの名無しさん
2021/06/17(木) 10:28:32.50ID:fU6donkc
多分同じ奴だと思うが、数スレ前から多次元配列を自力でどうこうしようとしてる奴、悪いこと言わんから外部ライブラリ使うとけ
今の時代、行列とかテンソルの計算は並の人間が書いた C/C++ じゃ絶対に Python (NumPy) その他に敵わんと思う

まあ C/C++ の多次元配列ライブラリも群雄割拠で何が何だか全く分からないんだが
STL に多次元配列が中々入らない理由もこれかな
368デフォルトの名無しさん
2021/06/17(木) 10:29:56.26ID:fU6donkc
つーか入ったところで大したもんにはなり得ないか
行列の分解とか掛け算を STL が担うのはあり得んしな
369デフォルトの名無しさん
2021/06/17(木) 10:31:47.16ID:kZP6q6xj
>>365
難癖もクソも普通にC/C++の欠点でしょ
フロッピーディスクの時代の遺物よ
370デフォルトの名無しさん
2021/06/17(木) 10:34:24.84ID:qVo1n1YK
>>369
別におまえさんにC/C++を使ってくれなんて頼んでない
嫌いなら出てってもらって構わない
371デフォルトの名無しさん
2021/06/17(木) 10:36:52.42ID:kZP6q6xj
>>370
誰が嫌いなんて言った?
欠点を差し引いてもメリットがあるから使ってるんだし、欠点は欠点として認めないと進歩しないよ
372デフォルトの名無しさん
2021/06/17(木) 10:48:03.95ID:EQR7Wr8E
質問です
#define A L"xyz"
#define B L"www"
を結合するとき
#define C AB
じゃだめなんですか?
#define D A(B)
ですか?
それとも
#define E A"www"
ですか?
373デフォルトの名無しさん
2021/06/17(木) 10:51:16.93ID:ADII7SgV
#define C A B
じゃね
374デフォルトの名無しさん
2021/06/17(木) 10:52:13.35ID:qVo1n1YK
>>371
欠点は欠点として認めるって具体的にどうしてるんだ?
プロトタイプを一切しない、のような公害か?
375デフォルトの名無しさん
2021/06/17(木) 11:09:25.36ID:4N0CEvnv
>>374
いや昔の貧弱な環境でもビルドできるように、って制約が無きゃもうちょっと違う形だったんじゃないの
今みたいにヘッダが肥大化しがちで各ソースごとに同じ解析しなきゃならないのは不自然ではある
IDEやコンパイラが賢いおかげでそこまでビルド時間酷くはならんようだけど

>>367
行列とかに関しては特に、C++のみで限界までチューニングしたってSIMD使ったコードにはまず勝てない(さらに言えばGPGPU使った方が、大きい行列ではもっと速い
それらを汎用化して使いやすくするのは可能だろうけど、そんなハード依存が激しいものを標準に入れるのか、それともハード依存は無いがめっちゃ半端なものを作るかの二択になるからでしょ
376デフォルトの名無しさん
2021/06/17(木) 11:16:45.59ID:Wy62wyA7
>>372
#define C A##B
377デフォルトの名無しさん
2021/06/17(木) 11:31:03.61ID:qVo1n1YK
>>375
具体的にどうしてるんだ? と聞いてるんだが
答えたくないならいいよ
378デフォルトの名無しさん
2021/06/17(木) 11:38:23.32ID:4N0CEvnv
IDも知らんのかこいつは
379デフォルトの名無しさん
2021/06/17(木) 11:48:01.35ID:qVo1n1YK
日本語でおk
380デフォルトの名無しさん
2021/06/17(木) 12:15:01.57ID:fU6donkc
>>375
はい
そう申しております
381デフォルトの名無しさん
2021/06/17(木) 12:21:37.22ID:I9fxtS5z
>>379
375「俺は371じゃないから質問に答えろと言われても知らない」
382デフォルトの名無しさん
2021/06/17(木) 12:33:13.95ID:qVo1n1YK
横レスにしても頓珍漢すぎるだろ
今、横レスとして読み直したが俺にアンカー振られている意味がわからない
383デフォルトの名無しさん
2021/06/17(木) 12:36:53.30ID:4N0CEvnv
>>369に噛み付いてるんだから欠点じゃないと言いたいんだろ?
頓珍漢はお前だ(>>374でも相当おかしな事言ってるが

>>380
すまん直後の書き込み読んでなかった
384デフォルトの名無しさん
2021/06/17(木) 12:43:39.21ID:qVo1n1YK
>>383
また例のオウム返し野郎か
何がおかしいのか説明できないやつがハッタリかますんじゃねえ
385361
2021/06/17(木) 20:43:21.47ID:3vRllUUS
>>365
俺の>361,364の一体どこをどう読めばそんな解釈ができるのか教えてくれよ
俺が否定してるのはこれ↓
>さらに実装は別ファイルにしてヘッダファイル内で#includeする
これは全然「テンプレートでない関数をプロトタイプと実装に分けただけ」じゃないよ
(藁人形論法ってやつか?これ)
386デフォルトの名無しさん
2021/06/18(金) 00:22:44.11ID:h1swrzIp
ポインタはchar * const p = q; とでも書かないとpがconstにならないが
char& c = *q; と書いたらそんなリスクを回避できる
革命的前進
387デフォルトの名無しさん
2021/06/18(金) 00:25:25.92ID:h1swrzIp
>>376
ハア?
#define C(A, B) A##B
にしないと駄目なんじゃ……

もっともK&Rの頃のCなら
#define C A/**/B
と書くことはできたっぽい
388デフォルトの名無しさん
2021/06/18(金) 08:34:36.86ID:R4m5mk7U
>>372のAとBを連結するなら>>373でいいだろ。括弧でくくった方がいいかもしれんが。
##は用途が違う。
389デフォルトの名無しさん
2021/06/18(金) 09:49:26.06ID:24jxp6EK
実装も書いてあるヘッダファイルって src に置くの? include に置くの?
390デフォルトの名無しさん
2021/06/18(金) 09:57:10.61ID:LzkNSM+F
boost のライブラリって、一度入ったら時代遅れになっても取り除かれないんですか?
それとも boost の全貌を把握してる委員会みたいのがあって、ちゃんと選別みたいなことをしてるんですか?

今どきムーブセマンティックに対応してないデカいコンテナクラスを見つけて、そういう疑問を持ちました
391デフォルトの名無しさん
2021/06/18(金) 10:08:12.10ID:kJSePQf1
>>385
俺は
> 何か所にも同じのを書くのが嫌なら
> テンプレートでない関数をプロトタイプと実装に分けただけで難癖つけるのか?
と言ったんだ

二行目だけ切り取ってきて人のこと藁人形とは藁わせてくれるやつだな
392デフォルトの名無しさん
2021/06/18(金) 10:17:41.61ID:7GC3MWRE
>>385
純粋に気になるんだけど、例えば俺が>>366で書いたようにテンプレートの実体化が起きる前に関数、メンバ関数の実装を分けてインクルードすることは出来るけど
実体化が起きる翻訳単位では必ず実装が必要になるよね?(テンプレートの分離コンパイルは出来ないという問題から)

クラステンプレートのポインタや参照しか使わない翻訳単位では、例えばiosfwdみたいに前方宣言しか書いてないヘッダを使うことで、ビルド時間減らせるかもしれんけど

そういう意味ではクラステンプレートの定義書いてるヘッダで、メンバ関数の実装を書いたヘッダをインクルードするのは別におかしくはないと思うんだが
393デフォルトの名無しさん
2021/06/18(金) 12:27:14.41ID:7Huy+AZL
>>389
src に .hpp が置いてあるプロジェクト観たことあるけど
かっこ悪いと思った
394デフォルトの名無しさん
2021/06/18(金) 12:47:25.93ID:24jxp6EK
include に置いてあるファイルに実装めっちゃ書いてあってももちろん嫌じゃないですか?
395デフォルトの名無しさん
2021/06/18(金) 12:54:04.57ID:kejK9s3z
いやも何も、テンプレートは明示的実体化して使えるテンプレートパラメータを制限でもしない限り、ヘッダに実装するしかないんだよ
可読性の問題を気にしてるなら拡張子変えればいい
ヘッダだからって.hや.hppじゃなきゃいけないなんて決まりは無いしinclude(フォルダかグループか知らんけど)直下に置かなきゃいかんわけでもない
そのくらい自分で工夫しろ
396デフォルトの名無しさん
2021/06/18(金) 13:18:46.12ID:7Huy+AZL
.obj で分割するメリットって .exe が巨大化しないためってのもあるけど
テンプレ使うと各 .obj 全部に同じバイナリーが増殖しない?
397デフォルトの名無しさん
2021/06/18(金) 13:51:38.82ID:kejK9s3z
多分だけど、今時の環境だと一度他の翻訳単位で実体化されたものは再利用するんじゃなかったかな
398デフォルトの名無しさん
2021/06/18(金) 14:28:08.43ID:ru+U9KL5
リンク前に判るの?
リンク時に同じ名前で同じ引数ならまとめるの?
怖くない?
399デフォルトの名無しさん
2021/06/18(金) 14:31:16.93ID:kJSePQf1
lexical phase 9だな
400デフォルトの名無しさん
2021/06/18(金) 20:05:16.88ID:Ipfg6SU0
>>391
論旨変わってないだろ、何が切り取りだか
で、お前のその変な疑問がどこから出たのか聞いてるんだけど

>>392
「そういう意味」がどういう意味なのかよくわからない
.hに宣言しか書いてないからコンパイル時間が減るんであって、
.hで定義をincludeしたら減らないよ?
401デフォルトの名無しさん
2021/06/18(金) 20:29:54.81ID:kejK9s3z
>>400
テンプレートの話やろ?
翻訳単位のどこかに定義(実装)が必ず要るんだぞ
あるソース(翻訳単位)においては不完全型でいいんなら、そこで使うヘッダは前方宣言だけでいい(クラス定義は要らん)って書いたじゃん
クラス定義が要るんならそれは実体化を伴うんだからメンバ関数の実装ヘッダに書いてなきゃリンカエラー出るぞ
402デフォルトの名無しさん
2021/06/19(土) 06:14:13.07ID:BH9bYKW9
>>400
だから1行目を読め
読みたくないなら逃げるのはおまえさんの勝手だが
逃げた事実は消えないぞ
403デフォルトの名無しさん
2021/06/19(土) 06:30:02.69ID:o72o+RiW
>>390
だめなboostライブラリというのは、そりゃ山ほどある
メンテナという概念は一応あろうが
404デフォルトの名無しさん
2021/06/19(土) 07:50:07.39ID:do8R3N0p
>>398
YES実際恐ろしい
"a.cpp"に
class Foo { void some_method() const { return 3.0; } };

"b.cpp"に
class Foo { void some_method() const { return 4.5; } };
int main() { Foo x; printf("%f\n", x.some_method()); }

とか書いてリンクして実行したら3.0と表示されることがある
ビルド中に警告とかは無し(於VC++ 2010

というわけでクラス定義は極力ヘッダファイルに書くのが正しいい
二つのFooクラスの定義を同時にincludeしたら確実にビルドエラーになってワカル

どうしても.cppファイル側にクラスの定義を書くときは無名namespaceで囲うべきや
(名前付きnamespaceは名前の重複についてクラス定義ほど検査が厳しくないのであまり解決策にならない
405デフォルトの名無しさん
2021/06/19(土) 08:09:04.24ID:do8R3N0p
今ジッケソしたがVC++ 2019でも同じだぬ、
"a.cpp"
#include <stdio.h>
class Foo { public: double some_method() const { return 3.0; } };
double get_Foo() { Foo y; return y.some_method(); }

"b.cpp"
#include <stdio.h>
extern double get_Foo();
class Foo { public: double some_method() const { return 4.5; } };
int main() { printf("%f\n", get_Foo()); Foo x; printf("%f\n", x.some_method()); }

実行結果:
3.000000
3.000000

4.5どこ行った;;;
406デフォルトの名無しさん
2021/06/19(土) 08:55:28.76ID:MSAvpN3e
初歩的なことかもしれませんが質問させてください。
以下の3ファイルがあるとして、src.cpp をコンパイルしようとすると失敗します。
hoge の myclass に対する特殊化を file2.hpp でしてるだけだから OK だと思ったのですが、無理でした。
一方で、file1.hpp の中身を file2.hpp の下の方にコピペしたらコンパイルできます。
この、hoge の特殊化を file2.hpp でしてるという考え方はどう間違ってるのでしょうか。


// file1.hpp
template<class T> void hoge(T);
template<class T> void fuga(T x){
 hoge(x);
}

// file2.hpp
#include"file1.hpp"
#include"myclass.hpp"
template<class T, int N> void hoge(myclass<T, N> x){
 ...
}

// src.cpp
#include"file2.hpp"
int main(){
 myclass<int, 10> x;
 fuga(x);
}
407デフォルトの名無しさん
2021/06/19(土) 09:03:50.50ID:N/imZiDN
>>406
無理でしたとは?コンパイルエラー?エラーメッセージは?
408デフォルトの名無しさん
2021/06/19(土) 11:19:08.00ID:xVp2TfT/
それ多分特殊化じゃなくてオーバーロード?(違ってたらすまん
hogeの<T>を受け取る奴で実体化した後にmyclass受け取る奴が出てくることになる

myclass版の前方宣言をfile1.hpp(fugaより前)に書くか、fugaの実装をfile2.hppのインクルードより後にすればいける、と思う
409はちみつ餃子 ◆8X2XSCHEME
2021/06/19(土) 14:35:39.56ID:/f53/cxR
>>406
それは >>408 が指摘する通りオーバーロードになってる。
オーバーロードの解決方法は複雑なんで私もちょっと自信はないんだけど、
オーバーロードの候補の内で実引数の型と完全に同一 (または実引数の型に cv 修飾したもの) のものがあれば、
それの優先度はテンプレート引数のマッチより高いので曖昧さは生じずに解決できるのが正しい。

そんで >>408 がいう

> hogeの<T>を受け取る奴で実体化した後にmyclass受け取る奴が出てくることになる

というのはたぶん関係ないと思う。
Two phase name lookup のルールが適用されるはずだから fuga 内での hoge の呼出しは
その時点では解決を試みられず、 main 内での fuga の呼出しが有った時に
fuga の実体化が起こってそのときに hoge も実体化されるので
宣言の順序にかかわらずどちらの hoge も候補になるはず。

なので include がどうこうというのとは関係なく
file2.hpp のほうの hoge が問題なく呼び出されるべきで、 >>406 に間違いはないと思う。

手元に入れてないから動作確認できないんだけど古い MSVC は Two phase lookup の実装が
おかしかったとか聞くからそのへんで何か問題が起こってるんじゃないか?
GCC や Clang だとかなり古いバージョンでも特に問題なくコンパイルできてる。
410デフォルトの名無しさん
2021/06/19(土) 15:55:55.01ID:zDrgWeBe
>>405
リンクする順番変えたら 4.5 になったり 3.0 になったりするかもしれないししないかもしれない
411はちみつ餃子 ◆8X2XSCHEME
2021/06/19(土) 16:47:38.21ID:/f53/cxR
>>396
古典的なツールチェインでは同一のものがそれぞれの翻訳単位に作られる。
その上でリンク時に同じものは同じに統合される。

それが嫌だという場合にはテンプレートには明示的実体化という仕組みがあって、
暗黙的な実体化を抑制する仕組み (extern template) とセットで使うことで
テンプレートの実体をひとつの翻訳単位にまとめることは出来る。

当然だが個別に指定するのはめんどいし、
いまどきの処理系は賢いので、あまり使われてないと思う。
412デフォルトの名無しさん
2021/06/19(土) 18:01:09.17ID:xVp2TfT/
>>406,>>408
うろ覚えだったのでスマンコ
というか自分がその手の順序依存を経験したのはVC2008-2015あたりまでだった気がする
最近のだとC++標準への準拠の設定(コンパイルオプション/Zc:twoPhaseとか)も影響するはず
413デフォルトの名無しさん
2021/06/19(土) 18:07:00.49ID:xVp2TfT/
間違えた、>>406,>>409
2017あたりまで標準への準拠のオプション(名前不明)は指定しないと有効にならなかった気がする、2019では既定
414デフォルトの名無しさん
2021/06/19(土) 18:48:12.63ID:xVp2TfT/
/permissive-
やった(VS2017
2015以前なら>>408のような対策するしかないと思う
415デフォルトの名無しさん
2021/06/20(日) 04:37:05.08ID:aJXir9C9
>>407
失礼しました
短縮して書くと
undefined reference to 'void hoge<myclass<int, 10>>(myclass<int, 10>)'
というメッセージが出ます

コンパイラは g++ 11.1.0 です


用語の使い方が正しいか自信がありませんが、
file1.hpp 内で hoge の宣言と hoge を呼ぶためのユーティリティ関数 fuga の実装をしておいて、後から必要に応じて具体的な型について hoge の実装を書ける、という方がすわりが良いのですが、こういう考え方は間違っていますか
fuga は型によらず hoge を呼ぶための関数なのでその実装を後に回したくない、という思いもあります
416デフォルトの名無しさん
2021/06/20(日) 07:43:07.12ID:vxtAtGft
C言語の double _Complex と C++ の std::complex<double> って実部虚部の並び方とか一緒ですよね?
ヘッダファイル aaa.h で宣言されてる double _Complex * をとる関数に std::complex<double> * を渡したいのですが、やり方がわかりません。


#define 〇〇 std::complex<double>
#include<aaa.h>
みたいにできると想像してるのですが、合っているでしょうか?
417デフォルトの名無しさん
2021/06/20(日) 08:46:26.25ID:D2z+V4uq
>>416
_Complexはただのdouble型変数なのでstd::complex<double>と互換性なし
418デフォルトの名無しさん
2021/06/20(日) 08:59:29.33ID:vxtAtGft
>>417
メモリレイアウトから違うのですか?
では、double _Complex * をとる関数に std::complex<double> * を渡すことはできないということですか?
419デフォルトの名無しさん
2021/06/20(日) 09:04:23.23ID:D2z+V4uq
はい
420デフォルトの名無しさん
2021/06/20(日) 09:11:24.89ID:vxtAtGft
エ!?
_Complex って std::complex の後にできたんじゃありませんでしたか
なぜ、実部と虚部がメモリ上に連続で置かれているという設計にしなかったのでしょうか……
421デフォルトの名無しさん
2021/06/20(日) 09:29:15.86ID:yGlwqyqX
作りが似ている、ということと
互換性が保証されている、ということは同じじゃないぞ

保証があるか否かは規格票で確認することで主観が入る余地はない
俺が見た範囲では保証するとは書いてなかった
422デフォルトの名無しさん
2021/06/20(日) 09:29:35.37ID:D2z+V4uq
_Comolex変数の実部と虚部をそれぞれcreal(), cimag()で取得してstd::complex<double>変数にセットするしかない
423デフォルトの名無しさん
2021/06/20(日) 09:35:42.79ID:D2z+V4uq
_ComplexがC99でstd::complex<T>がC++03
424デフォルトの名無しさん
2021/06/20(日) 09:53:39.49ID:Q4Tfx6ZF
>>415
>>406に嘘書いてないか?
425デフォルトの名無しさん
2021/06/20(日) 10:06:25.46ID:vSSpHRy4
std::complex<double> *hoge;
double _Complex *p = (double _Complex *)&hoge[0];
426デフォルトの名無しさん
2021/06/20(日) 10:06:45.88ID:76n7YcAv
>>424
すみません
どこか矛盾しますでしょうか
手元でコンパイルしてみて、そうなりました
427デフォルトの名無しさん
2021/06/20(日) 10:22:51.51ID:Q4Tfx6ZF
>>408は試してみた?
428デフォルトの名無しさん
2021/06/20(日) 10:33:37.36ID:76n7YcAv
>>427
はい
>>408様の仰る「fuga の実装を後に書く」というのが、>>406に書いた「下の方にコピペしたら」というのです
そして、それらのことを踏まえて、>>415に書いたような疑問を持ちました

ところで嘘というのはどういうものでしょうか
なにか矛盾しますでしょうか
429デフォルトの名無しさん
2021/06/20(日) 11:18:41.97ID:Q4Tfx6ZF
hogeの実装(関数の中身)を実際は書いてなかったとか、何か事実と違うことがあるんじゃないかと思った
だけ

>>415に書いてある理由なら、同じコンパイラであればどこか妥協するしかない気が
fugaの前方宣言だけはfile1に残して、実装を別のヘッダにして後からインクルードするとかは?(>>408で言ったのはそういうことなんだけど
430デフォルトの名無しさん
2021/06/20(日) 14:29:11.44ID:vxtAtGft
>>421-422
今調べたら、C側は実部虚部というメモリレイアウトを保証していて、std::complex 側は C の複素数と同じメモリレイアウトを保証してるようですね

>>423
すみませんCの方が早かったんですね

>>425
ありがとうございます
暗黙のキャストがなぜ許されないのかはまだよく分かっていませんが、キャスト自体は可能なようで、double _Complex (あるいはそのポインタ) をとる C 言語関数に std::complex<double> (あるいはそのポインタ) を適切にキャストして渡すのは問題ないようになってると理解しました
431デフォルトの名無しさん
2021/06/20(日) 15:33:53.67ID:yGlwqyqX
>>430
その件について
ISO/IEC 9899でC++という文言に言及するか
ISO/IEC 14882でCという文言に言及しているか?
430に書かれている限りでは「似ている」だけだが

それからC++03は2003年にC++98のバグ修正をしただけだから
C99より古いぞ
432デフォルトの名無しさん
2021/06/20(日) 15:42:44.16ID:iNrFbyNf
良スレ気体age
433デフォルトの名無しさん
2021/06/20(日) 16:06:01.76ID:vxtAtGft
>>431
いや、すみません。逆に「似ている」とはどういう意味でしょうか

例えば std::complex については
http://eel.is/c++draft/complex.numbers
の記述からしてメモリレイアウトは実部虚部と決まってるわけですが、これはソースとは見なせないんでしたっけ?
434デフォルトの名無しさん
2021/06/20(日) 16:11:41.02ID:vxtAtGft
>>431
> それからC++03は2003年にC++98のバグ修正をしただけだから
> C99より古いぞ
ですから、
>>430
> Cの方が早かった
のでは?


あと>>433は「std::complex は C の複素数型と同じことを保証する」という記述は含みませんね
ただ、この場合メモリレイアウトが同じであることの他に要請するべきことってありますっけ?
435デフォルトの名無しさん
2021/06/20(日) 16:13:04.04ID:vxtAtGft
>>431,434
> ですから、
> >>430
> > Cの方が早かった
> のでは?

すみません
間違えました
ごっちゃになってました
これは取り消します
436デフォルトの名無しさん
2021/06/20(日) 17:28:56.50ID:KYXAfitG
https://stackoverflow.com/questions/55563217/do-complex-types-in-c99-behave-like-stdcomplex-in-c
ここを読むとメモリレイアウトは同一みたいなんだよね。むりやりキャストしても問題なさそうな気がするけど
437デフォルトの名無しさん
2021/06/20(日) 17:50:06.69ID:CGp4yDz+
本質的なデータはdouble2つ組だし、順序も普通は実部→虚部だろうし、わざわざパディングや別の変なメンバ混ぜることも考えにくいし
たまたまレイアウト一致する可能性は現実的に高いだろうけど
規格が保証してるかどうかはまた別の話かな
438◆QZaw55cn4c
2021/06/20(日) 17:59:57.69ID:DQg/pXKj
もう C は C89 で止めれ
C++ は C89 だけ受け付け可能であれば、あとは好きに変えてもらってもかまわない
439デフォルトの名無しさん
2021/06/20(日) 18:02:34.31ID:D2z+V4uq
C/C++の複素数の構造体・クラス間の変換関数を規格として用意してもらうしかない
440デフォルトの名無しさん
2021/06/20(日) 18:23:00.50ID:zi1IwKwq
インテルコンパイラの最適化オプションO2とO3で計算結果が変わって、問題を起こしている箇所を見つけようと思ってるんですが、
$ icpc -O3 src.cpp -lhoge
とコンパイルしてる場合、当然 src.cpp に問題があるのであって別でビルドされたライブラリ hoge は無関係と思って良いですよね?
441デフォルトの名無しさん
2021/06/20(日) 18:49:17.01ID:zi1IwKwq
ゲェーッ -O3 はダメだけど -fast は期待通りに動きました
あまりにも意味不明なのでこれに手を出すのはやめておきます
失礼しました
442デフォルトの名無しさん
2021/06/20(日) 18:57:42.79ID:CGp4yDz+
やべー未定義動作踏んでそう
443デフォルトの名無しさん
2021/06/20(日) 19:09:16.56ID:akuykRB/
あるよなぁ。
FortifyやCodeSonarといった静的解析ツールで検出できたらいいが、どこまでできるんだろう。
444デフォルトの名無しさん
2021/06/20(日) 23:58:43.73ID:iNrFbyNf
複素数とか高々数値メンバが2つとかそれぐらいの話なのに
なんでビットコピーできないと発狂するのかイミフ
445デフォルトの名無しさん
2021/06/20(日) 23:59:56.38ID:iNrFbyNf
備え付けの手段で実数部と虚数部毎に代入するとか
構築とかしたらええんじゃ
446デフォルトの名無しさん
2021/06/21(月) 01:37:57.43ID:czIvoWKn
>>437
>>436によるとサイズも並びも一致することを規格が暗に示してるようなんだ。1つ目の回答を見てくれ
447デフォルトの名無しさん
2021/06/21(月) 01:48:21.79ID:0g7/88j3
まだ「暗に」とか言ってんのこのキチガイ
コイツのせいで不必要に大事になった感はあるよね
448デフォルトの名無しさん
2021/06/21(月) 01:52:02.85ID:Im5VqdJw
>>446
お前のコードで誰にも迷惑かからないなら、もう規格云々はいいから自分の思い込みたいように好きにやれば良いよ
449デフォルトの名無しさん
2021/06/21(月) 09:03:02.99ID:G6bnr+rx
T* をとるオーバーロードコンストラクタに const T* x を渡したら、argument do not much だからとエラーになりました。
が、(T*)x を渡したらOKでした。
(T*)をつけてようがつけてなかろうが、x というポインタの const 性は変わりませんよね?
(つまり x を変える挙動があったらプログラムは終了しますよね?)
なぜ引数の型のマッチには (T*) が必要なのでしょうか。

できればキャストしたくないので、こうすれば避けれるとかこう思えば安全というのがあったら教えていただきたいです
450デフォルトの名無しさん
2021/06/21(月) 09:16:37.40ID:yA/sh2j8
>>449
const性変わるんじゃない?

const T* xなんだから xはの先にある*xは変えてはいけないという指示をコードかいた人は出していて
そのT*をとるコンストラクタはその中で変更する可能性を言ってるんだから
T*にキャストして渡したらコンストラクタの中で変更され可能性が出るよ
451デフォルトの名無しさん
2021/06/21(月) 09:20:07.55ID:yA/sh2j8
>>449
ああ、だから>なぜ引数の型のマッチには (T*) が必要なのでしょうか。
というと
本来ならconst指定されてて変更してはいけない変数を、変更するけどいいのね?というコンパイラからの確認的なもの
452デフォルトの名無しさん
2021/06/21(月) 09:34:04.75ID:G6bnr+rx
>>450
> const性変わるんじゃない?
ありがとうございます。
誤解してました。
(というか、そこ変えれるなら何でもありな気が……)


>>451
実は、他人の作ったライブラリとの橋渡しでこういう問題が出ました。
知る限りではそのライブラリは引数のポインタの指してる先を変えないのですが、どうやらキャストはするしかないようですね。
この件で (T*) とは別に const_cast<T*> なるやり方の存在も知って、Cスタイルのキャストよりはこちらの方が良いという説明がいろんなところでされてるのですが、正直全く同じものに見えます。
なぜ const_cast の方がマシなのでしょうか?
453デフォルトの名無しさん
2021/06/21(月) 09:36:14.94ID:yU7HyP9W
うん、マシだね
特にその問題では
454デフォルトの名無しさん
2021/06/21(月) 09:49:17.82ID:yA/sh2j8
>>452
Cスタイルキャストは状況に応じてよしなにキャストしてくれるんだが
これがたまに意図しないキャストになる場合があるから、意味を明確にするためにC++のなんちゃらキャストをする
よほどのことがないと変なキャストにはならないとは思うけど一応
455デフォルトの名無しさん
2021/06/21(月) 09:58:36.45ID:yU7HyP9W
const_castはint*→char*のように指す先の型は変更できない
だから、そのような変更をしようとしたらエラーになるし
そのような変更を意図していないことも示せる
456デフォルトの名無しさん
2021/06/21(月) 10:07:37.10ID:5d1ivHhj
>>452
誤解してるようだけど、constってのは基本的にはバグ抑止のためのもので
文法上のルールに過ぎないのよ
実行時にチェックが走ったりするわけではない
で、意図的に破ることも一応出来る。意図的に破るときはそれが見てわかるようにconst_cast使おうね、
Cスタイルのキャストは何でも通しちゃうから避けようねってだけ
457デフォルトの名無しさん
2021/06/21(月) 10:07:43.43ID:G6bnr+rx
>>454-455
なるほど。ありがとうございます
今は const_cast で渡すことにします
458デフォルトの名無しさん
2021/06/21(月) 11:07:11.82ID:JzAz8iJE
>>441
この件諦めきれなくて少し調べてみたら、
-O3 はダメだが
-O3 -static -ipo は正常に動く
ことが分かった
更に、icpcでなくg++なら最適化レベルによらず正常に動くことが分かった

この場合陥っていがちな失敗なんてないですかね
ググってもなかなか体系的な知識に出会えなくて、、、
459デフォルトの名無しさん
2021/06/21(月) 15:28:43.32ID:os4CEfZ3
諦め切れないくらい気になるなら -S で .asm コード見るべき
460デフォルトの名無しさん
2021/06/21(月) 15:39:13.82ID:s5hePRzy
こんなところでC++が中途半端に出来るだけが自慢の専門卒みたいな連中に尋ねるよりも
大学の先生かチューターの院生に尋ねた方がいいだろう
進みたい研究室があればそこに行って訊くと良い
461デフォルトの名無しさん
2021/06/21(月) 16:20:08.51ID:mdGWC+9J
>>458
たぶん初期化漏れとかの未定義動作
-Wallでコンパイルすれば何かわかるんじゃね
462デフォルトの名無しさん
2021/06/21(月) 16:27:39.69ID:JzAz8iJE
>>459-461
すんませんあざす
asmコードとか未知の領域ですけど勉強になりそうですね

-Wallは一応常につけてて、ワーニング全部潰すようにはしてます
全部のオブジェクトにvolatile付けたり外したりしてみようかな
463デフォルトの名無しさん
2021/06/21(月) 17:09:40.79ID:os4CEfZ3
適当に弄って適当に動いたように観えて
適当に解決したって言い張るやつは成長しない
464デフォルトの名無しさん
2021/06/21(月) 17:40:48.54ID:uOMSqfSW
短かったり切り出せるようなコードだったらcompiler explorerとかもあるよ
465はちみつ餃子 ◆8X2XSCHEME
2021/06/21(月) 17:44:51.49ID:5bV+3LP7
const ではないオブジェクトについて const 付きにキャストしている場合には
const を剥がしてから書き込みをすることは OK だが、
元々 const なオブジェクトから const を剥がして書き込むのは未定義で、
実際に最適化で壊れることはある。
ちなみに const なオブジェクトから const を剥がしても読むのみなら OK。

LLVM 9.0 で const 領域への書き込みを最適化で削除するする方針になってる。
https://releases.llvm.org/9.0.0/docs/ReleaseNotes.html#noteworthy-optimizations
466デフォルトの名無しさん
2021/06/21(月) 20:26:42.47ID:yU7HyP9W
>>460
院生ねえ。。。修士の新人は手放しできないんだけどな
レッテルで色眼鏡つかう奴って
情報処理特種とかでもひれ伏すのか?
学生みたいなコード書くアホ知ってるけどw
467デフォルトの名無しさん
2021/06/21(月) 23:06:59.47ID:0VSE6TcG
インテルコンパイラ様ともなれば
プラグマで関数単位で最適化レベルを変えられるんじゃないの
動くパティーンが分かっているのなら二分探索で問題の箇所を見つけるこ
とができうる
468デフォルトの名無しさん
2021/06/22(火) 00:52:42.42ID:JdLoAtTW
C++の参照で渡した構造体を
中で別の構造体に実態コピーしたい時ってどうしたらいいんでしょう

void CTest::SetData(Kouzoutai &kozo)
{
if(kozo.judge == 1){
_KozoTmp = kozo;
}else{
//色々する
}
}

とすると、_KozoTmpってkozoと同じアドレスになっちゃって、
_KozoTmp.judge = 10とかしちゃうともとのkozo.judgeも変わっちゃいますよね
ポインタだったら
_KozoTmp = *kozo;
とかやればいいんでしょうけど
参照で渡した時ってどう書けばいいんでしょう
469デフォルトの名無しさん
2021/06/22(火) 01:00:09.80ID:cH2Us/Cy
それで普通にコピーされるだろ
なんでされないと思うの?
470デフォルトの名無しさん
2021/06/22(火) 01:05:17.48ID:JdLoAtTW
参照にした時って、ポインタみたいにアドレスコピーにならないの?
471デフォルトの名無しさん
2021/06/22(火) 01:15:12.93ID:cH2Us/Cy
あのさ、_KozoTmpは何だ?Kouzoutai型だろ?Kouzoutai*でもKouzoutai&でもないだろ?
なんでアドレスなんか持てると思うの?
472デフォルトの名無しさん
2021/06/22(火) 01:21:47.48ID:JdLoAtTW
あ、そうなんだ
ありがとうございます
kozoを参照で渡したから
_KotoTmpも無理矢理アドレスになるかと思ってました
473はちみつ餃子 ◆8X2XSCHEME
2021/06/22(火) 01:22:19.02ID:Ikkk/uWu
>>468
参照というのはいうなれば別名。
SetData の実引数と kozo は「同じもの」と考えて構わない。 (少なくともその場合は)
474デフォルトの名無しさん
2021/06/22(火) 10:52:00.08ID:2AbGnqy7
copy コンストラクタ と move コンストラクタ ってみんなちゃんと書いてる?
デフォにまかせてる?
475デフォルトの名無しさん
2021/06/22(火) 11:08:19.79ID:jiZrgPwV
ものによる
ポインタやハンドルがあれば書いたり=delete;したり
実体だけなら大抵デフォ
476デフォルトの名無しさん
2021/06/22(火) 11:38:53.75ID:PhquAAua
=defaultが多い
477デフォルトの名無しさん
2021/06/22(火) 11:45:11.84ID:hpNVAZMN
コピーコンストラクタがあったらムーブ自動生成されないんでしょ?
478デフォルトの名無しさん
2021/06/22(火) 13:58:37.72ID:jiZrgPwV
俺、タイプ量の少なさは美しさの1つだと思ってるから
=default;は本当に必要なときだけ書く
479デフォルトの名無しさん
2021/06/22(火) 14:51:15.52ID:4bX8g7Cj
doxygenでドキュメント作成してるけどソースが見づらくてコメント無い方がいいのではと思ってしまう
480デフォルトの名無しさん
2021/06/22(火) 15:03:38.14ID:zJk9T2bQ
>>479
関数ヘッダーだけでええんちゃうん?
481デフォルトの名無しさん
2021/06/22(火) 16:50:07.47ID:T8maLWCY
>>480
テンプレート系のライブラリなので
482◆QZaw55cn4c
2021/06/22(火) 19:42:13.49ID:9FGytWqi
もう C は C89 で止めれ
C++ は C89 だけ受け付け可能であれば、あとは好きに変えてもらってもかまわない
483◆QZaw55cn4c
2021/06/22(火) 19:43:07.45ID:9FGytWqi
>>473
反対せざるを得ない意見です…‥
484◆QZaw55cn4c
2021/06/22(火) 19:43:53.44ID:9FGytWqi
>>474
コピコンはちゃんと書きますが、ムーブ?何?それ美味しいの?
485デフォルトの名無しさん
2021/06/22(火) 20:42:23.52ID:InXfs1nZ
>>477
あったら使われる(一時オブジェクトの場合に)ってだけだぞ
やること一緒なら書かんでいい、時間の無駄
486デフォルトの名無しさん
2021/06/22(火) 21:50:49.86ID:7Ks2gqqv
>>474
デフォルトで済まない場合だけ明示的に記述するのが普通じゃないかねぇ。
=defaultにするか暗黙定義にするかは好みがあるだろうけど。
487デフォルトの名無しさん
2021/06/22(火) 22:22:06.65ID:4bX8g7Cj
>>484
美味しいとき”も”あるよ
488デフォルトの名無しさん
2021/06/22(火) 22:45:00.81ID:d6n1ZZoB
>>482-484
ロートルはちょっと黙ってて
489はちみつ餃子 ◆8X2XSCHEME
2021/06/23(水) 04:03:41.13ID:pZ1DtdbH
>>482
C89 ってことは暗黙の関数宣言とかのウンコ機能も含めて言ってるわけ?
490デフォルトの名無しさん
2021/06/23(水) 04:16:44.74ID:Vmwdc4hc
>>485
最近デカくて古いコンテナのコピーに悩まされてるから、アドレスを託すみたいな形でムーブしたい
491デフォルトの名無しさん
2021/06/23(水) 06:19:12.12ID:rIfoeFmJ
コピー回避なんていくらでもどうにでもなるのに
どんなヘボなんだ
492デフォルトの名無しさん
2021/06/23(水) 08:31:09.62ID:nCHirhrB
いや、だからそれがアドレスを渡すとか参照で渡すってことでしょ
493◆QZaw55cn4c
2021/06/24(木) 20:04:48.26ID:i6kIKJxB
>>488
黙れ、小僧!
お前に C++ の苦しみが分かるのか?
494◆QZaw55cn4c
2021/06/24(木) 20:10:35.44ID:i6kIKJxB
>>489
ウンコ機能はC99の方が多い、という認識です
495◆QZaw55cn4c
2021/06/24(木) 20:11:16.37ID:i6kIKJxB
>>487
具体的に
496デフォルトの名無しさん
2021/06/24(木) 21:10:55.26ID:3QBHDC7A
>>495
メモリ確保するようなクラスの場合、メモリ確保の手間省ける。
それ以外でムーブにコピー以上の利点知らない
497デフォルトの名無しさん
2021/06/25(金) 00:44:09.12ID:+R97TjGx
んまー(通常の関数呼び出しと違って)コピコンは放っといても勝手に呼び出しが削減される(副作用がある可能性ガン無視で)からな
昔から
498デフォルトの名無しさん
2021/06/25(金) 00:55:10.74ID:+R97TjGx
コピコン呼び出し最適化に頼らねばにっちもさっちも行かないシチュエーションは多々あるから
右辺値参照はマジ不完全
例えば
Foo operator+(const Foo& lhs, const Foo& rhs) {
 Foo x(lhs); // 馬鹿正直にやったらコピー1回
 x += rhs; // Foo& Foo::operator+=()が定義済みとする
 return x; // 馬鹿正直にやったらコピーがもう一回
}
みたいな、
とこの前思いました
※ 個人の感想です
499◆QZaw55cn4c
2021/06/25(金) 01:03:22.61ID:pWufOIHg
>>496
要はクラスC のオブジェクトA の中にポインタがあった場合、オブジェクトA を今後一切つかわない前提でオブジェクトA の持つポインタの値をオブジェクトB にコピーするやりかた、ということですよね
言われるほど凄い機能にも革新的な機能にも思えないので来ているのですが、クラスを返すときには、もしかしたら使えるかもしれませんね

でも、すでに RVO があるのでしょう?
500デフォルトの名無しさん
2021/06/25(金) 01:11:32.66ID:xLwe8284
>>498
それは左辺値参照だよ。
501はちみつ餃子 ◆8X2XSCHEME
2021/06/25(金) 01:12:27.64ID:/YhIejlL
>>499
それが出来るということは重要じゃなくて文脈によって勝手に使い分けられるということに意味があるんだよ。
502デフォルトの名無しさん
2021/06/25(金) 04:23:14.07ID:2CfGrUVh
move対応してないデカいクラスはマジ迷惑だろ
503デフォルトの名無しさん
2021/06/25(金) 06:23:42.07ID:+QaNJXlp
ポインタ、参照、this、スマポ、[&]
いくらでもどうにでもなる
504デフォルトの名無しさん
2021/06/25(金) 06:38:22.69ID:byKvXpEn
えっ老害??
505デフォルトの名無しさん
2021/06/25(金) 06:40:16.50ID:FhN3idtW
>>499
RVOはC++17で保証されたけどNRVOは保証されてない
506デフォルトの名無しさん
2021/06/25(金) 07:44:44.86ID:+QaNJXlp
C++03時代を生きてないやつからはそう見えるのか
507デフォルトの名無しさん
2021/06/25(金) 08:48:57.50ID:z3/X9CIt
{a, b, c,...} が a, b, c,... という要素からなるリストを表すとき、
{a, {b, {c, d}, e}, f, g, {h, i},...}
みたいな構造は a, b, c,... が全部同じ型だとしても tuple としてしか表せませんよね?
508デフォルトの名無しさん
2021/06/25(金) 10:23:01.70ID:Wd+wOk9Z
json
yaml
listのtree
なんでも
509デフォルトの名無しさん
2021/06/25(金) 10:45:58.24ID:z3/X9CIt
>>508
ありがとうございます
そうですね。STLとかboostのコンテナに囚われ過ぎてました
510デフォルトの名無しさん
2021/06/25(金) 10:52:18.80ID:tyTj/nU0
老害はC++スレに書き込むなよ
昔の話ばっかだよおじいちゃん
511デフォルトの名無しさん
2021/06/25(金) 13:12:18.39ID:+QaNJXlp
後から入ってきたくせに図々しいやつだな
先住権てやつでこっちが偉いんだよ
気に入らねえんなら他当たるか自分でサーバー立てな
512デフォルトの名無しさん
2021/06/25(金) 13:16:46.30ID:cHfQsTpJ
C++03の話なんてもうすんなよ
C++11からはもう別言語やんか
513デフォルトの名無しさん
2021/06/25(金) 13:27:35.28ID:+QaNJXlp
おまえの主観は関係ない
514はちみつ餃子 ◆8X2XSCHEME
2021/06/25(金) 13:41:54.77ID:/YhIejlL
>>506
C++03 時代を知ってるからそれが (少なくとも C++11 に比べれば) クソだってこともよく知ってるよ。
515デフォルトの名無しさん
2021/06/25(金) 13:43:28.90ID:ALny3hkX
本気で別言語だと思ってるやつって大抵何も作ってないゴミガキだと思うけどなぁ・・
STL的なアルゴリズムや新要素と親和性が高いのは、基本的に標準ライブラリだけなんだが

最近各種コンストラクタ(ムーブ込み)、代入等だけ長々と書いて「実質ほぼ何もしないクラス」を書いてドヤってるアホとかよく見かける

便利になってるのは確かだけどね・・
516デフォルトの名無しさん
2021/06/25(金) 13:45:10.88ID:ALny3hkX
>>514
俺も必要もなく03以前で書きたいとはまず思わんが、クソとか貶すのはやめた方がいいと思うよ
517デフォルトの名無しさん
2021/06/25(金) 18:07:04.42ID:aibvvCTW
gets()とか好きそう
518デフォルトの名無しさん
2021/06/25(金) 18:33:58.19ID:xqBptTy/
(σ・∀・)σゲッツ!!
519デフォルトの名無しさん
2021/06/26(土) 00:08:46.09ID:O9GH5wVp
ゲッツって初めて聞いた
ゲットエスって読んでたんだが
520デフォルトの名無しさん
2021/06/26(土) 07:06:09.54ID:MV3qzcHy
こことCスレでは古くからあるネッスラだよ
521デフォルトの名無しさん
2021/06/26(土) 07:21:39.68ID:+MI3rh96
scanf()をスキャンフと呼ぶけどprintf()をプリントエフと呼ぶ感じ
522デフォルトの名無しさん
2021/06/26(土) 08:05:40.57ID:vR4ZYNRj
プリンテフ
523デフォルトの名無しさん
2021/06/26(土) 08:08:29.30ID:EcYCTODA
ifndef イフンデフ
524デフォルトの名無しさん
2021/06/26(土) 11:51:24.28ID:7nyRjnb4
アとイ
525デフォルトの名無しさん
2021/06/26(土) 13:16:45.08ID:l0P5IISj
C++20でもバイナリファイルからdoubleとかの値を読み出す時って未だにreinterpret_cast使う感じ?
526デフォルトの名無しさん
2021/06/26(土) 16:37:39.40ID:qjgQHw2b
HTML★ふとまる
527デフォルトの名無しさん
2021/06/27(日) 10:16:13.68ID:0fbyaJPK
basic_istream::readの引数がvoid*なら何も悩まずに済むのにな
528デフォルトの名無しさん
2021/06/27(日) 11:20:36.11ID:hddKqCef
ファイルに書いている時点でアラインメントの保証が難しいから結局memcpyになる気がする
529デフォルトの名無しさん
2021/06/27(日) 12:53:25.35ID:CJK40NDs
アライメントの問題はファイル関係なくね↑?
530デフォルトの名無しさん
2021/06/27(日) 13:14:05.28ID:CJK40NDs
エンディアン変換が関係しない場合
C++20でもバイナリファイルからdoubleとかの値を読み出す時はfread()
書き込むときはfwrite()
何の問題も無いし速い……
531デフォルトの名無しさん
2021/06/27(日) 13:16:25.37ID:CJK40NDs
ていうかエンディアン変換が関係する場合でも
fread()してからメモリ上でエンディアン変換しても良いし
メモリ上でエンディアン変換してからfwrite()したら良い
特にファイル内容全体がメモリ上に収まるケースとかは上記だけでほとんど何も考えなくてもよい
532デフォルトの名無しさん
2021/06/27(日) 13:48:27.15ID:NNV++T6E
P言語、Ruby、Java、C#などでファイルを読んだり書いたりしなければならなくなることを想定したファイル仕様にしたほうがいいと思うけどどうかな
533はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 13:55:06.53ID:+5rTVQj/
スタンダードレイアウトな型はバイナリレベルでコピーしてかまわないし
結果的に fwrite して fread できることは保証されるが、
具体的なレイアウトについての保証はない (他の処理系では同じレイアウトにならないかもしれない)
ということも合わせて考えると適当なシリアライザは挟んだほうが良いな。

多言語を意識しつつ高速なバイナリフォーマットというと MessagePack あたりかな?
534デフォルトの名無しさん
2021/06/27(日) 13:57:17.27ID:mY5L/v8k
PerlやPythonでバイナリ読み書きするのに何の支障もないだろ。
535はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 14:00:08.24ID:+5rTVQj/
>>534
読み書きに支障はないが、言語上の型とバイナリの対応付けについて明確な保証がないと困る。
536デフォルトの名無しさん
2021/06/27(日) 14:16:00.40ID:U1pSP8r9
バイナリなんだからどう扱おうが自由だろ
言語のせいにするのは本人の技術が無いから
言い訳するな
537◆QZaw55cn4c
2021/06/27(日) 14:25:54.48ID:I46qTe+f
今時数値をバイナリで読み書きするとか、あり得ないのでは?
538デフォルトの名無しさん
2021/06/27(日) 14:30:38.43ID:NNV++T6E
Comparison of data-serialization formats - Wikipedia
https://en.wikipedia.org/wiki/Comparison_of_data-serialization_formats
539デフォルトの名無しさん
2021/06/27(日) 15:19:43.80ID:o9peEwic
>>537
バイナリでないと実用的でないデータなんていくらでもあるし。画像、動画、アーカイブ、db、ip...
qzはもうエロ画像見るなよ。
540◆QZaw55cn4c
2021/06/27(日) 15:44:56.12ID:I46qTe+f
>>539
ごめんなさい誤りましたので謝りますからその刑だけは平にご容赦を‥‥
541デフォルトの名無しさん
2021/06/27(日) 15:47:12.10ID:mY5L/v8k
>>535
保証されてるから支障はない。エンディアンが違うデータだって読み書きできる。
542はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 15:54:09.98ID:+5rTVQj/
>>541
データがリトルエンディアンなのかビッグエンディアンなのかわかっていればね。
C++ が単にメモリ上のデータを書き出したときに、それがどっちなのか、
(言語としては) 保証してないって話をしてるんだよ。
543デフォルトの名無しさん
2021/06/27(日) 16:14:20.16ID:jKhjPg/S
C++20でstd::endianが使えるようになるけど
544◆QZaw55cn4c
2021/06/27(日) 16:39:33.97ID:I46qTe+f
シェアの高かった 68 系かインテルザイログ系か、の二分図がここにも残っているのですか
もう UTF-8 のようなエンディアンに依存しないバイナリが優秀だ、という価値観にするべきかと
545デフォルトの名無しさん
2021/06/27(日) 17:01:10.06ID:CxF0bT8t
インターネットのプロトコルはビックエンディアン
USB等のPC系発祥のデバイスはリトルエンディアン
この辺はもう変更しようが無いだろ
546はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 18:13:48.48ID:+5rTVQj/
>>544
ここでのトピックは >>530 に対しての反論。
メモリ上にあるバイト列には保証がないからなんらかの明確な
データ交換用フォーマットに変換する処理が必要という話で、
出力先のデータ交換用フォーマットが BE か LE かなんていう以前の段階。
547はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 18:17:55.59ID:+5rTVQj/
ファイルに書き出すにあたって「エンディアンの変換が不要なら」という前提を置きたくねぇなぁという話だな。
パディングとかも入るかもわからんし。
548◆QZaw55cn4c
2021/06/27(日) 19:47:44.56ID:igNiq52h
>>546
であれば、私はどちらかというと >>530 の味方側ですね、>>530 がそう意図しているかどうかは不明ですが、処理系のエンディアンを仮定することなくコードを書くことは可能だったと記憶しています。‥‥①

ただ同時に、確かにパフォーマンスの点で過剰な不利を承知で >>537 を再提示するべきかな
つまり、>>537 みたいな画像フォーマットはありました PPM/PGM/PBM
http://2chb.net/r/tech/1434079972/73 
このコードは①を検証したものだったかと遠い記憶に残っていますね

あ、罰ゲームは勘弁ね、私だってエロ画像は見たい‥‥
549はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 20:29:20.98ID:+5rTVQj/
>>548
だからそういうコードが書けるかどうかという話じゃなくて
書かなきゃなんない (書くべき) ねという話なんだってば。
550◆QZaw55cn4c
2021/06/27(日) 20:58:56.14ID:2wFMzLzL
>>549
それは失礼しました
551デフォルトの名無しさん
2021/06/27(日) 22:44:17.18ID:mY5L/v8k
>>542
C++だって読もうとするバイナリデータのエンディアンを事前に知らなきゃならんのは変わらんだろ。
自分で書いたものを読むならエンディアンが一致するのはあたりまえ。
552はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 23:46:30.32ID:+5rTVQj/
>>551
> エンディアンを事前に知らなきゃならんのは

知らなきゃならないがわからん (保証されてない) のだという話をしている。
C++ で書いてメモリをそのまま書き出したらそれのエンディアンは保証されてない。

言語が何であれデータフォーマットが固定されてないとどうにもならん。
553デフォルトの名無しさん
2021/06/27(日) 23:53:27.71ID:mY5L/v8k
>>552
それは言語関係ない話だろ。
554はちみつ餃子 ◆8X2XSCHEME
2021/06/28(月) 00:31:47.85ID:nxXyAxnK
>>553
言語に関係あるという話はしてないよ。
555デフォルトの名無しさん
2021/06/28(月) 00:34:04.32ID:AdoNh79c
Javaはメモリモデルも明確に決まってたんじゃないかな
556デフォルトの名無しさん
2021/06/28(月) 02:47:25.75ID:DsF+RsPk
多言語間でポータブルにしたくば
XMLとかyamlとかjsonにしたら良いんじゃーあ!
557デフォルトの名無しさん
2021/06/28(月) 03:12:57.95ID:DsF+RsPk
どうしてもバイナリファイルが良いという向きは、
パディングとかもfwrite()とfread()で取り扱い得る
といっても単に適当なサイズのバイトの配列として読み書きして
メモリ上でご使用のアーキテクチャーに合わせることになるが
fwrite()とfread()を使わなければもっとマシになるという類の話ではない
558デフォルトの名無しさん
2021/06/28(月) 03:44:20.73ID:QdlxBFRk
別にバイナリ吐き出すときは必ずポータブルにする必要ないだろうに
なんで勝手に条件追加して批判してんだか
559◆QZaw55cn4c
2021/06/28(月) 07:17:27.29ID:oYDZ1nWa
>>556
お手軽な XML/yaml/json 読み書きライブラリを紹介してください、よろしくお願いいたします
560デフォルトの名無しさん
2021/06/28(月) 07:48:39.66ID:cZa6zFVz
>>554
PerlでもPythonでもC++と変わりなくバイナリの読み書きはできるという話をしてるんだが。
エンディアンがわからなければC++でも読めないというのは当たり前。
フォーマットを知らないバイナリファイルってことだからな。
561デフォルトの名無しさん
2021/06/28(月) 08:30:45.47ID:RYml5aTx
これ以上、バイナリ読み書きの話をする前にとりあえず>>538に目を通せ
車輪の再発明をしたいのか、既存の車輪を利用したいのかをはっきりさせてから話を進めたほうがいい
562デフォルトの名無しさん
2021/06/28(月) 09:09:23.58ID:XSoi24Ug
僕はノンバイナリーだから読みたくないです
563デフォルトの名無しさん
2021/06/28(月) 09:56:34.91ID:SQEqm/bz
こんどはバイナリに噛み付いてるキチガイがいるな
564デフォルトの名無しさん
2021/06/28(月) 11:09:48.91ID:bLKGwGq9
標準ライブラリのみであれば車輪の再発明しか手段がない?
565デフォルトの名無しさん
2021/06/28(月) 12:52:58.19ID:bIZ7S0Sd
MsgPack は json と同じで無駄が多い
566デフォルトの名無しさん
2021/06/28(月) 12:59:22.39ID:bIZ7S0Sd
>>558
温暖化詐欺SDG詐欺と手口が一緒だな
567デフォルトの名無しさん
2021/06/28(月) 13:35:34.04ID:quG4wdoj
>>559
WSL2, Ubuntu 18.04 では、

apt list --installed libxml2

libxml2/bionic-updates,bionic-security,bionic-updates,bionic-security,
now 2.9.4+dfsg1-6.1ubuntu1.4 amd64 [インストール済み、自動]
568デフォルトの名無しさん
2021/06/28(月) 13:52:30.89ID:5OdlGlMi
Comparisonて何て読むの?
コンパリソン?
569デフォルトの名無しさん
2021/06/28(月) 14:55:11.19ID:qFu4iqR6
msgpackはクソやね
バイナリの扱いに慣れないスクリプト坊がバイナリを扱わざるを得なくなった場合を除いては全く価値のないフォーマット
570デフォルトの名無しさん
2021/06/28(月) 14:56:29.69ID:R7ScYjSP
>>568 こんpぇぁりzん https://www.google.com/search?q=comparison
571デフォルトの名無しさん
2021/06/28(月) 15:26:12.03ID:JcAv6JCW
>バイナリの扱いに慣れないスクリプト坊がバイナリを扱わざるを得なくなった場合

この表現すき💛
572デフォルトの名無しさん
2021/06/28(月) 15:26:13.01ID:JcAv6JCW
>バイナリの扱いに慣れないスクリプト坊がバイナリを扱わざるを得なくなった場合

この表現すき💛
573デフォルトの名無しさん
2021/06/28(月) 16:13:11.20ID:dKXkMhte
>>569のお勧めは何?
理由もセットで教えて頂戴。
574デフォルトの名無しさん
2021/06/28(月) 16:32:50.30ID:uBCftstC
「モジュール」はC++で作られたパッケージを配布しやすくしますか?
575はちみつ餃子 ◆8X2XSCHEME
2021/06/29(火) 00:03:30.47ID:OP5z1lEO
>>560
そうだよ。 その当たり前の話をしてるんだよ……。

互換性の問題というのは内部的なものなら問題が起きたときに修正すればいいが、
外部に出ているデータはそれに皆が合わせなければならない仕様と化すので
特定の C++ 処理系 (実行環境) でなら処理できるけど
出力されたデータフォーマットの詳細はわからんし処理系のバージョンがちょっと変わったら変わるかもしれん
というのでは困るやんというごく普通の話。
(もちろん普通の処理系はちょっとバージョンが更新されたくらいでは
バイナリ互換性をあまり壊さないように配慮するのが普通ではあるけど。)
576デフォルトの名無しさん
2021/06/29(火) 00:15:58.47ID:MxyOwUyS
>>575
いつのまにか話ずらしてんな。

>>535
>読み書きに支障はないが、言語上の型とバイナリの対応付けについて明確な保証がないと困る。

言語上の型とバイナリの対応付けはPerlでもPythonでも保証されてるんだよ。
577はちみつ餃子 ◆8X2XSCHEME
2021/06/29(火) 00:20:30.40ID:OP5z1lEO
>>576
されないよ。
ファイルのバイナリが BE か LE かわかっていない状況の話なんだから。
578デフォルトの名無しさん
2021/06/29(火) 08:12:22.23ID:MxyOwUyS
>BE か LE かわかっていない状況

これの意味だが

・全く何の情報もない状況
→どんな言語を使おうが正しく読める保証がないし論ずるだけ無駄。

>>552の「C++ で書いてメモリをそのまま書き出したらそれのエンディアンは保証されてない。」状況
→「自環境のエンディアン」で読めるのはC++でもPerlでもPythonでも同じ。
579デフォルトの名無しさん
2021/06/29(火) 08:29:00.28ID:qbDSHPwG
>>573
方法はともかく、普通にビット列かバイト列のレベルで仕様を決めてその通りに読み書きすりゃいいんじゃない
C++プログラマなら生データの扱いは得意でしょ
とはいえ手間がかかるしミスを生じやすいのも事実なので、めんどくせえ今すぐ読み書きしたいってだけならprotobufとかavroとか他にも色々あるよ
msgpackとの大きな違いはスキーマの有無で、スクリプト言語じゃなきゃスキーマはあったほうが便利だし、一般に実装が高速になりやすくデータサイズも小さくできる
580デフォルトの名無しさん
2021/06/29(火) 08:38:20.49ID:zFDqDEto
>>579
「他人含めた仕様の強要」という観点が抜けてない?
それに、何回車輪の再開発させるつもりだよ。
581デフォルトの名無しさん
2021/06/29(火) 08:57:28.61ID:bpKPj1F0
>>580
強要したいならちゃんと仕様書書いて押し付けるだけの話
実装が面倒ってんならそれこそprotobufのようなスキーマのある汎用フォーマットならスキーマさえ書いとけば大抵の言語でserde用の型の自動生成までやってくれるよ
その点で言えばmsgpackは所詮mapなんで、仕様を強要したいなら別途仕様書が必要になるよ
582デフォルトの名無しさん
2021/06/29(火) 10:54:24.87ID:c9Dh6S0q
実の無い話はすぐ切り上げるのが大事だぞ
お互いの時間を無駄にしあってはいけない
583デフォルトの名無しさん
2021/06/29(火) 12:00:43.57ID:gO51uzZW
他人に構ってもらわなければ生きて行けないかまってちゃん人種は救いようがない
584デフォルトの名無しさん
2021/06/29(火) 13:20:29.38ID:IWxlvq96
>>560
Perlでバイナリを扱うのは物凄く大変だった。
さまざまな自動変換がかかってしまうので、結局どうなるのかが分からない事が
多かったから。
例えば、数値なのか、文字なのかの区別が曖昧な感じで、たままた数値が入った
文字が、勝手に数値になって、'0' + 1 が、0x30 + 1 のつもりが、0 + 1に
なってしまったり、物凄く難しかった。
ASCIIコードの数値番号を取得したいと思っても、結果が数値の入った文字列に
なったりとか、よく分からない事が多かった。
何を何に変換しているのか、めちゃくちゃ難しかった。
それがRubyになって、素直な感じになった。
585デフォルトの名無しさん
2021/06/29(火) 13:23:14.00ID:IWxlvq96
>>584
16進数も複雑だった。
単に表示したいために16進数の文字列に直したら、どこかで勝手に数値として
解釈されていつの間にか思いもよらぬ「もの」に変化したりとか。
それで、バイナリや文字を細かく扱い際には、如何にCが楽であるかを思い知った。
586デフォルトの名無しさん
2021/06/29(火) 14:44:15.68ID:UyxOx+sC
Cというか、それは最早動的型付けか静的型付けかとかの話では
587デフォルトの名無しさん
2021/06/29(火) 15:11:46.24ID:IWxlvq96
>>586
JSやRubyは、動的型付けだけど、Perlのように文字と数値の相互変換が勝手に
起きたりはしない。
588デフォルトの名無しさん
2021/06/29(火) 15:25:41.01ID:MxyOwUyS
pack/unpack使えばそんな変なことにはならんぞ。
perlでバイナリ扱うなら常識。
589デフォルトの名無しさん
2021/06/29(火) 15:37:31.39ID:IWxlvq96
>>588
それ自体はそうでも、その後いろいろなことが起きてややこしかったな。
590デフォルトの名無しさん
2021/06/29(火) 18:21:23.30ID:7i3kfcoq
強気なこと書き込む人はだいたい経験浅い
591デフォルトの名無しさん
2021/06/29(火) 18:35:19.68ID:tM55IFN7
ボカァもうOOPは捨てた!w
592◆QZaw55cn4c
2021/06/29(火) 18:54:36.80ID:qfvhyFdx
>>578
あなたはちょっと残念な人ですね

実際には C/C++ ならば、処理系が LE/BE どちらに依存かにもかかわらず処理系に独立して LE なら LE用, BE なら BE用に書きわけることができる‥‥①
①の証拠は >>548
ことほど左様に、処理系に独立して LE/BE を書き分けることができるのなら「~するべき」とかいう「べき論」は無意味でしょう
多分、はちみつ氏は①を失念していたのでしょう、べき論なんて振り回しても無駄なのに、あいかわらずべき論に拘泥するところなどは「ダメリカ様が守ってくださる!」的な馬鹿左翼並の振る舞いですから、そろそろあきらめるべきでしょうね
593デフォルトの名無しさん
2021/06/29(火) 21:05:01.01ID:MxyOwUyS
>>592

なにか別の話とごっちゃにしてないか?べき論って???

>実際には C/C++ ならば、処理系が LE/BE どちらに依存かにもかかわらず処理系に独立して LE なら LE用, BE なら BE用に書きわけることができる‥‥①

C/C++じゃなくてもPerlやPythonだってLE/BE書き分けられる手段は用意されているって話をしていただけなんだがな。
594デフォルトの名無しさん
2021/06/29(火) 21:08:28.05ID:MxyOwUyS
>>589
pack/unpackの後の話ならバイナリファイルとか関係なくて、ようは「Perlがややこしかった」というだけだろ。

>例えば、数値なのか、文字なのかの区別が曖昧な感じで、たままた数値が入った
>文字が、勝手に数値になって、'0' + 1 が、0x30 + 1 のつもりが、0 + 1に
>なってしまったり、物凄く難しかった。

これなんかまさにそうだな。
595デフォルトの名無しさん
2021/06/29(火) 23:39:33.94ID:uMLxaJ5z
この話のゴールどこ?
596デフォルトの名無しさん
2021/06/29(火) 23:59:54.04ID:yAVMK7JX
pack/unpack使え
597デフォルトの名無しさん
2021/06/30(水) 00:03:10.10ID:6riO4yVW
use strict
use warnings;;
use Carp;
use utf8;
#use Encode; # ウィンドーズのパスを使う場合必須
our $os_enc = 'cp932';
binmode STDIN, ":encoding($os_enc)";
binmode STDOUT, "encoding(%os_enc)";

でエラーかどうかは
(エラー出ない条件) or croak "*** ERR ***";  # 改行は付けない

にしてpack/unpackを使ったら何も起きない
598デフォルトの名無しさん
2021/06/30(水) 00:07:43.06ID:d2kdzRUr
Encodeは日本語入りのパスとか$ARGV[]とかをutf8にしたり戻したりするのに使う
コマンドプロンプトの文字をutf8にしたら実はEncode要らんかもしれんがそこまでは知らん
599デフォルトの名無しさん
2021/06/30(水) 00:40:50.04ID:uW/S3RKL
Perlの特定の某なんか出されても知らんがな……
600デフォルトの名無しさん
2021/06/30(水) 03:10:15.08ID:vkj6zKzF
Perl Python PHP Java C# EcmaScript TypeScript Javaくらいは流石に教養だろうさ。
601デフォルトの名無しさん
2021/06/30(水) 07:38:15.64ID:F9CAzHJ+
func の返り値を変数 hoge に受けるときって
auto hoge = func();
auto& hoge = func();
auto&& hoge = func();
のいずれにおいてもオブジェクトの再構築 (コピー) は行われないって思って良いんですよね?
602デフォルトの名無しさん
2021/06/30(水) 10:58:31.75ID:x9tVpfG6
no
603デフォルトの名無しさん
2021/06/30(水) 11:13:43.85ID:EDSlPJC8
>>601
c++17:値のコピー省略を保証、て奴かね。

戻り値が右辺値かどうかで変わるんじゃない?
604デフォルトの名無しさん
2021/06/30(水) 12:11:32.93ID:2LaR0NZ5
関数の戻り値は必ず右辺値のはずだが。
605デフォルトの名無しさん
2021/06/30(水) 12:19:35.40ID:8KWEqHlz
んなこたーない
606デフォルトの名無しさん
2021/06/30(水) 12:29:48.99ID:sL9lkuh+
参照返し……と思ったけど、
参照て右辺値だっけ?左辺値だっけ?
607デフォルトの名無しさん
2021/06/30(水) 13:29:54.24ID:2LaR0NZ5
関数の戻り値は、戻り値の型が左辺値参照で有る場合だけは左辺値で、
それ以外は右辺値らしい。
608デフォルトの名無しさん
2021/06/30(水) 13:34:03.56ID:2LaR0NZ5
>>606
戻り値の型が右辺値参照の場合、関数呼び出しの結果は、xvalueだが、分類上は、右辺値でもあり、glvalueでもある。
戻り値の型が左辺値参照の場合、関数呼び出しの結果は、左辺値。
戻り値の型が参照型でない場合、関数呼び出しの結果は、prvalueで、右辺値。

prvalue = 純粋右辺値。
glvalue = 一般化左辺値。
xvalue = 消えかかっている値。謎の値とも言われる。
609デフォルトの名無しさん
2021/06/30(水) 13:39:20.73ID:2LaR0NZ5
>>601
一番上の書き方だと、少なくとも move になる。
下の二つは、moveもcopyも行われないで、アドレスだけが参照型変数に
入るのだと思う。
610デフォルトの名無しさん
2021/06/30(水) 14:18:47.26ID:DhAhW4Ik
>>609
funcの戻り値型が左辺値参照の場合moveにはならんのでは?
611デフォルトの名無しさん
2021/06/30(水) 14:56:49.27ID:2LaR0NZ5
>>610
その通りで、コピーコンストラクタが呼び出される気がする。
「少なくとも」と書いたのは、効率面で最低でも move が生じる
という意味で書いたつもりだった。
612デフォルトの名無しさん
2021/07/03(土) 19:40:59.20ID:Ju/axMXt
くっそ素朴な疑問だけど
「operator>>」
って声に出して読むときどうしてる?

独学/個人開発なので他の人から聞く機会がない
613デフォルトの名無しさん
2021/07/03(土) 19:42:38.50ID:dunp4iC4
右シフト記号?
614デフォルトの名無しさん
2021/07/03(土) 20:04:04.63ID:ApVtA7Dx
入力オーバーライドとか? うーん・・・ダブルGT!
615デフォルトの名無しさん
2021/07/03(土) 20:04:56.30ID:Y97o1UBK
個人的には「おぺれーたーだいなりだいなり」だな
他人には言ったことないけど
616デフォルトの名無しさん
2021/07/03(土) 20:18:12.60ID:Ju/axMXt
自分のレス読んで気づいたけど他の人に声出し読むう機会も無いからどうでもいいな
617デフォルトの名無しさん
2021/07/03(土) 20:23:06.99ID:A2f3M294
おぺれーたーぐれぐれ
618デフォルトの名無しさん
2021/07/03(土) 21:03:34.16ID:WO4lFPcp
オペレータ・イン

<<は当然オペレータ・アウト
619デフォルトの名無しさん
2021/07/03(土) 21:05:23.40ID:WO4lFPcp
朗読問題は根深くて、古くは漢文の読み下しからあり、
座右の書たるC言語を256倍使うための本にもちゃんと発音方法が載ってる
620デフォルトの名無しさん
2021/07/03(土) 21:29:09.42ID:iUoBj2xP
>> みぎみぎ
<< ひだりひだり
621デフォルトの名無しさん
2021/07/03(土) 21:41:24.77ID:iArH0hMS
>>603-611
ありがとうございます
func の返り値が左辺値参照である場合を除けば、コピーは起こらないでFAですね

で、func の返り値は左辺値参照でない限りは右辺値だとすると、auto& じゃ受けれないから auto&& で受けるべきということですね
622デフォルトの名無しさん
2021/07/03(土) 22:59:31.74ID:5pcVeoYl
オペレーター、クィっ、クィっ
623デフォルトの名無しさん
2021/07/04(日) 03:21:06.85ID:WJcubPcO
auto hoge = func()
は場合によってはコピーが起きる
という印象、

なぜなら戻り値をスタックのどこに積むかをfunc()の側で指定できないから
hogeの実体ドンピシャにfunc()内で構築できる保証が無い
コピーが省略され得るのは
 auto hoge = func();
 bar(hoge);
みたいな呼び出し元がhogeの用の一時的領域を次の関数呼び出しの引数としてやりくりできる場合だけなんじゃないの
624デフォルトの名無しさん
2021/07/04(日) 07:20:46.94ID:kv3QS/1l
ISO/IEC 14882に準じて
おぺれーたーらいとしふと
625デフォルトの名無しさん
2021/07/04(日) 08:34:51.74ID:mLloSLib
>>623
???
最適化されて bar(func()) になるときだけオブジェクトの構築が省略されるって言いたいの?
アホか全然レイヤの違う話だよ
右辺値左辺値の概念全く理解しとらんのか (何十年前のプログラマだ)
「印象」でものを語るな
626デフォルトの名無しさん
2021/07/04(日) 10:01:09.26ID:mLloSLib
それはそうと、こんなスレでも右辺値と左辺値よくわかってない (概念としてはわかっててもある場合のある値がどっちか判然としない) 人が多いのは、C++のムーブセマンティクスが洗練されてる証拠かもな
つまり、プログラマの預かり知らぬところで自動でコピーとムーブが仕分けされているという
627デフォルトの名無しさん
2021/07/04(日) 10:11:22.75ID:dMFRzHLQ
>>623
https://wandbox.org/permlink/FOkFiS1EumCHBr0F
そんなことないよな? と思いつつやってみた
まあ、そんなことないよな

ただ実験してて一個だけ気になったのが
take_S(S());
ってやった場合、default→moveじゃなくて単にmoveとしか表示されなかった
C++11/14でも-fno-elide-constructorsを付けない限りmoveだけ
これってなんで?
628デフォルトの名無しさん
2021/07/04(日) 10:44:02.96ID:pili1Lz/
>>619
万葉集は読み下しですらないからな
629デフォルトの名無しさん
2021/07/04(日) 11:45:10.82ID:WJcubPcO
>>627
解説キボティーヌ
"copy"と表示されているわけだが
630デフォルトの名無しさん
2021/07/04(日) 11:56:43.39ID:WJcubPcO
つかそれを除けば>>623の通りなんじゃないの

>take_S(S());
>ってやった場合、default→moveじゃなくて単にmoveとしか表示されなかった
これは呼び出し元がS()の戻り値の実体をtake_S()の引数の実体と合一(スタック上の同一アドレス)にできた例
defaultコンが呼ばれなかったのはstruct Sがメンバを持たないから最適化でデフォルトコンストラが削除された例

通常の関数呼び出しでcoutする処理が削除されたらそればバグだが、
コンストラクタの呼び出し削減の最適化はコンストラクタ内で副作用のある処理を行っている可能性を
無視して行われることが規格のどっかで認められているはず……
631デフォルトの名無しさん
2021/07/04(日) 12:12:47.00ID:WJcubPcO
>最適化されて bar(func()) になるときだけオブジェクトの構築が省略されるって言いたいの?
微妙にちげう func()がオブジェクトをコピー返しする関数である以上、その場合だけムーブにする余地があると言ってゐる
実際は
 auto hoge = func()
 bar(hoge)
 (この後hogeを使う人は居ない)
と分けて書いたら"move"になりそうなケースなのに"copy"になったらしいが(>>627のリンク先

>アホか全然レイヤの違う話だよ
ムーブにできるのは参照の付け替えとみなせるケースなので上の話(コピーをムーブと読み替え得る条件)が別レイヤの話とは認められない
632デフォルトの名無しさん
2021/07/04(日) 12:32:59.30ID:dMFRzHLQ
>>629
表示されたってことは省略されてないよね?
633デフォルトの名無しさん
2021/07/04(日) 12:34:44.04ID:dMFRzHLQ
実験の部分を同時に話題にするべきではなかったな
634デフォルトの名無しさん
2021/07/04(日) 12:54:00.52ID:WJcubPcO
>>632
"move"にならずに"copy"になったのは謎だと>>631に書いてある

とわいえ、>>623の主張を整理すると、
 (1) func()が定義上オブジェクトをコピー返しする関数である場合、auto hoge = func() がムーブになるとは限らず、場合によってはコピーが起きる
 (2) ただし、bar(func()) というケースでは、func()の戻り値をbar()に渡す際に、コピーではなくムーブが選択される余地がある
というものであって、bar(func())に類似のケース(>>627のリンク先)でムーブにならずコピーになったからといって>>623が否定されたことにはならない
(∵ムーブが選択される「余地がある」と言っただけであってムーブにする義務があると言ったわけではない
635デフォルトの名無しさん
2021/07/04(日) 13:00:30.08ID:WJcubPcO
ここで「func()が定義上オブジェクトをコピー返しする関数である」のに何でコピーが削除されてムーブに成り得るのか?
という疑問を抱く向きもあるかもしれないが、
これについては構造体やオブジェクトをコピー返しするような関数func()が実際には
return valueの置き場所にデフォルト構築するだけのコードに落ちることがあるのを見たらワカル
636デフォルトの名無しさん
2021/07/04(日) 13:13:36.22ID:dMFRzHLQ
>>634
もしかして、コピーの代わりにムーブでオブジェクトが構築されることを「コピー省略」だと思ってる?だとしたら違うよ

ていうか実験の部分は自己解決しました
C++17で必須になったっていうだけで、それまでも(C++98ですらも)省略されることが許されるというのは明記されていたんですね
637デフォルトの名無しさん
2021/07/04(日) 13:25:14.33ID:bouvqZmG
「コピー返し」ってなんぞ?
638デフォルトの名無しさん
2021/07/04(日) 13:29:00.70ID:WJcubPcO
>>636
>もしかして、コピーの代わりにムーブでオブジェクトが構築されることを「コピー省略」だと思ってる?だとしたら違うよ
別に

言っているのは
1. オブジェクトの構築はfunc()内のどこかしらで行われる
2. 1の方法によっては、func()がreturn valueをreturnする際のコピーは省略される(func()がそういうコードになる
3. func()がスタック上に返したreturn valueを呼び出し元が自動変数hogeのエリアにコピーする代わりにbar()の引数エリアにmoveする
 ことがある(>>601が言うように常にmoveになる、というわけではない
と言う簡単な主張
639デフォルトの名無しさん
2021/07/04(日) 13:49:07.73ID:dMFRzHLQ
>>638
じゃあ結局>>623のこの部分は間違いってことでいいの?

> コピーが省略され得るのは
>  auto hoge = func();
>  bar(hoge);
> みたいな呼び出し元がhogeの用の一時的領域を次の関数呼び出しの引数としてやりくりできる場合だけなんじゃないの
640デフォルトの名無しさん
2021/07/04(日) 14:05:29.04ID:bouvqZmG
意味ワカンネ

1. func が内部でオブジェクトを構築する話
2. func の返り値を変数 hoge に束縛する話
3. func の返り値を後で他の関数に渡す話

全部切り分けて考えろよとしか思えんのだが

そして 2 について言えば>>621に尽きるだろとしか思えんのだが
641デフォルトの名無しさん
2021/07/04(日) 14:15:48.87ID:WJcubPcO
>>640
いやすまん2は確かに間違いでauto hoge = func()はhogeへのmoveで済む

>>639
いやすまん「~できる場合だけ」という限定は間違いやった

ついでに言うとbar(func())でたまたまfunc()がスタック上に作ったreturn valueのアドレスも変えずにそのままbar()に渡せるとき
moveが起きるという主張も間違いだったかも……(アドレスも変わらないのなら何の構築も不要
642デフォルトの名無しさん
2021/07/04(日) 14:27:18.68ID:bouvqZmG
何もかもおかしいよお前
「コピー返し」って結局なんやねん
独特の語法でわけのわからんことを主張するな
「印象」「かもしれない」で物事を主張するな
何がわかってて何がわかってないか知れ
質問と主張をごちゃまぜにするな
本格的に社会に居場所なくなるぞ

「全部取り下げます」とだけ言って去れ
で一から勉強しろ
643デフォルトの名無しさん
2021/07/04(日) 14:32:24.17ID:2p3tbjy0
RPGでアイテムを移動させた時に間違ってコピーされてアイテムが増殖する
ムーブしないといけない
アイテムは一個だけ
644デフォルトの名無しさん
2021/07/04(日) 14:37:46.88ID:HHbHqtlq
>>642
面倒見よくて草
昔はこの板にもアンタみたいな厳しい先輩いっぱい居たのにな
今はニワカと趣味グラマが何周送れかわからんポエム呟きあってるだけだし
昔からいる人らは完全スルーしてるはず
645デフォルトの名無しさん
2021/07/04(日) 14:52:36.20ID:WJcubPcO
>>642
Callerが(スタック上に)確保したメモリに対してcalleeが構造体を返すという返し方の意味
これについては統一した用語が無いようなのでむしろ知りたいっすね……

>>643
>>623のコードでSにムーブコンが定義されていなかったら増殖を意図しないケースでも
コピコンが呼ばれるのだから>>643はたとえとしてはイマイチ
646はちみつ餃子 ◆8X2XSCHEME
2021/07/04(日) 15:12:00.11ID:7/Zaj2J4
>>645
要件を満たすとき (返却値が prvalue のとき) は変数の場所に直接にオブジェクトが構築される.。
コピーやムーブを省略できるというのはそういう意味で、
特に C++17 以降ではコピー省略が許されるときにはコピーコンストラクタもムーブコンストラクタも存在しなくてもいい。

https://wandbox.org/permlink/FOndP8P7Ecv5v5sB
647デフォルトの名無しさん
2021/07/04(日) 15:50:43.27ID:WJcubPcO
>>646のコードをVS2019でビルドしたら
>error C2280: 'foo::foo(foo &&)': 削除された関数を参照しようとしています
と言われるorz

ていうか「prvalueならば必ず変数の場所に直接にオブジェクトが構築される」(例外なくそうなる)のだとしたら
これはcallerがcalleeに構築すべき変数のアドレスを渡さねば実現できない芸当だけど
ABIにそんな隠れた第n引数を設けることまでC++の規格で決めちゃって委員会、
とそこはかとなく疑問が……
(funcがメンバ変数だった場合、隠れた第1引数でthisを渡すことになっているのにこれにさらに追加?
648デフォルトの名無しさん
2021/07/04(日) 15:56:31.25ID:xLbwwiyt
いいからお前はRVOでぐぐって来い
話はそれからだ
649デフォルトの名無しさん
2021/07/04(日) 16:02:57.96ID:WJcubPcO
>>648
これか
https://blog.kmc.gr.jp/entry/2014/12/20/231430
>まるでメンバ関数における暗黙のthisポインタのように、関数の引数に戻り値を格納する先の変数へのアドレスを渡します。
>そしてそのアドレスの先の上にオブジェクトを構築することで、関数内部での一時オブジェクト
>生成を呼び出し元のオブジェクト生成とみなすことができます。 このようにしてRVOは実現されています。

>まるでメンバ関数における暗黙のthisポインタのように、関数の引数に戻り値を格納する先の変数へのアドレスを渡します。
mjk、
650デフォルトの名無しさん
2021/07/04(日) 16:18:10.24ID:2qJME2iB
>>649
RVO は、最適化の一種なので、実現方法は色々。
とにかく、コンパイラが、関数の戻り値から左辺へのコピーやムーブを
なるべく減らして、いきなりダイレクトに左辺に書き込むような方法を探し出して
コード化する。
それをどやってやるかは、関数呼び出しの ABI 依存。
651デフォルトの名無しさん
2021/07/04(日) 16:52:18.97ID:VOtERW9V
>>647
エラーになるのは、VS2019のデフォルトがC++14だから。
プロジェクトのプロパティ→構成プロパティ→C/C++→言語 の
「C++言語標準」を「ISO C++17標準(/std:c++17)」に変更すれば通る。
652デフォルトの名無しさん
2021/07/04(日) 18:28:13.63ID:WJcubPcO
>>651
確かに「C++言語標準」を「ISO C++17標準(/std:c++17)」に変更したら通った

>>651
>(RVOを)どやってやるかは、関数呼び出しの ABI 依存。
そういうものだと今の今まで思っていたが、
C++17で>>646のコード(コピコンもムーブコンも明示的に削除)がビルドが通るようになるということは、
第2の隠れた引数でcallerがcalleeに構築すべき変数のアドレスを渡すことが
C++17では義務化されるとしか解釈できないのでは……
653デフォルトの名無しさん
2021/07/04(日) 20:21:13.81ID:WJcubPcO
第2の隠れた引数でcallerがcalleeに構築すべき変数のアドレスを渡しているのだとすると
>>627のコードが"default"の次に"copy"になるのはある程度説明がつく
 1. return_S()関数でS構築 --- ここでS:S()が呼ばれ、"default"表示
 2. auto hoge = return_S()では何も起きない(∵1で&hogeにSが構築済み)
 3. take_S(hoge)で呼び出しの引数としてhogeをコピー
   --- &hogeにあるSが、スタックの上の方に引数としてコピーされる結果"copy"表示

しかしhogeはその後使っていないのだから、コンパイラ的には3はmoveになる余地があるはず

なお>>641までの漏れのレスは第2の隠れた引数は仮定せず、return_S()(callee)がスタックのトップに
return valueとしてS()を構築して、
それが呼び出し元(caller)が&hogeにcopy(ムーブコンがあればmove)する穏当なモデルを考えていた
実際n3337.pdf(古いが)を読む限りRVOのやり方は全く規定されてないからアリのはず……
何で>>642が怒り狂うのかわからん……
654デフォルトの名無しさん
2021/07/04(日) 22:02:15.33ID:dMFRzHLQ
>>652
別に実装として「隠れた引数」を使えとは規格上決まっていないよ
処理系は適当な専用のグローバル変数を使うようなコードを出力しても構わない

>>653
なんで>>642が怒り狂うのか?
>>642を読んで分からない分からない?
あなたの一連のレスはあなた自身以外の誰のためにもなっていないんだよね
>>642でするな、って言われていることは、そういう自分のためにしかならないことでスレを私物化する行為に等しいよってことだ
655デフォルトの名無しさん
2021/07/05(月) 08:27:16.47ID:4kBMhQOc
>>653
>>603は調べたんかいな。cpprefjp な。
RVOを含めて調べれば、>>646だということは分かるだろ。
c++標準の扱いはcpprefjpの参照リンクにもある「値のコピー省略の保証について」が良くまとまっている。

検索・調査能力が低いのは今どきのプログラマーとして致命的欠陥だから、日頃から訓練したほうがいい。
656デフォルトの名無しさん
2021/07/05(月) 08:31:59.73ID:4kBMhQOc
補足。
>>653の2はNRVOだからRVOとは別物な。
NRVOは最適化可能だけどコピー省略は保証されていない。
657デフォルトの名無しさん
2021/07/05(月) 08:44:01.31ID:4kBMhQOc
>>656
あ、間違えた。NRVOとは関係ないや。

ついでに。
>しかしhogeはその後使っていないのだから、コンパイラ的には3はmoveになる余地があるはず

副作用のあるコピーコンストラクタがあったら最適化はやばいんじゃない?
規格上許されていたっけ?
658デフォルトの名無しさん
2021/07/05(月) 11:05:56.38ID:w3Zb0u1p
ライフタイムを推論してcopy/moveの振り分けは理論上可能かもしれないが、現行の規格はそんなことは要求しない
lvalueからならcopy、rvalueからならmove
lvalueからmoveしてほしいならstd::moveしなさい
lvalueを渡しているのに勝手にrvalue referenceとして解釈されてぶっ壊されてたまるかよ
659デフォルトの名無しさん
2021/07/05(月) 12:24:14.81ID:M+MHtMKE
template<class T>
class A {
public:
A()=default;
A(T&&);
};
この場合、T==Aになるとmoveとcopyを兼ねる?
660デフォルトの名無しさん
2021/07/05(月) 13:59:53.08ID:MxHqaq3M
C++が出来るとは規格書がちゃんと読めることを言うんだね
661デフォルトの名無しさん
2021/07/05(月) 15:27:44.85ID:NDiogwds
Macのclang++でコンパイルしています。
cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
662デフォルトの名無しさん
2021/07/05(月) 15:36:50.05ID:M+MHtMKE
規格票には規格書なんて書いてない
俺はちゃんと読めるんだなんて
イキッてるやつはブーメランだな
663デフォルトの名無しさん
2021/07/06(火) 00:27:03.56ID:86XKd96p
>>657
許されてるよ
その状況でコピコンやムーコンが呼ばれるかどうかは未規定(呼んでも呼ばなくてもいい)
というかこの「呼ばなくてもいい」っていう規定こそが正に規格がNRVOを認めてる部分そのもの
664デフォルトの名無しさん
2021/07/06(火) 03:32:03.53ID:PiE4/OQH
実際、「move さえ省略してほしい」って思惑で
auto hoge = func();
と書くところを
auto&& hoge = func();
と書いてる人なんているの?
665デフォルトの名無しさん
2021/07/06(火) 07:29:15.81ID:6WiwYssU
いるよ。
666デフォルトの名無しさん
2021/07/06(火) 07:45:25.63ID:FcxtUR1g
>>657
エピステーメーも同じようなこと言ってたけどね
まぁコピーコンストラクタとかにコピー以外の副作用入れる方が悪い、ってことだろ
実際変な副作用など無いことを前提にしなきゃ出来ない最適化他にもあるやろ
667デフォルトの名無しさん
2021/07/06(火) 10:03:46.67ID:t2+Z62DR
>>661
stdlib.hにも定義されているが、他のヘッダをincludeすると、
その中から別のヘッダをincludeしている場合も有り、その中からさらに
別のヘッダをincludeしている場合も有る。
また、標準ではstdlib.hやcstdlibで定義されているとされていても、
その他のヘッダで定義されていないとも限らない。
668◆QZaw55cn4c
2021/07/06(火) 20:25:19.80ID:/lKUoH39
>>666
>コピーコンストラクタとかにコピー以外の副作用入れる方が悪い
規格票のどこに?
669デフォルトの名無しさん
2021/07/06(火) 23:17:37.91ID:2d1Iatqp
>>668
規格票持ってるんですか?
670デフォルトの名無しさん
2021/07/07(水) 00:20:29.64ID:ACi5C/C8
>>668
コイツたまにトリップ外すの忘れて荒らしみたいなことしてんの最高に滑稽
671はちみつ餃子 ◆8X2XSCHEME
2021/07/07(水) 05:18:00.78ID:BiM5c4gH
>>668
副作用がある場合でも省略されるというのは明記されている。

https://timsong-cpp.github.io/cppwp/n3337/class.copy#31
> even if the copy/move constructor and/or destructor for the object have side effects
672デフォルトの名無しさん
2021/07/10(土) 14:04:49.30ID:yQTcABkI
>>658
3がmoveになったところで何も壊れるものは無くね?
というのと、take_S()に渡される方がぶっ壊されることにはならないので
3がmoveになってもlvalueとして渡されることには変わりは無い
673デフォルトの名無しさん
2021/07/11(日) 00:07:46.98ID:5nx6GB9W
>>672
https://cpplover.blogspot.com/2009/11/rvalue-reference_23.html
とりあえずこれとか読んでからお願いします
全体的に何が言いたいかよく分からないですがmoveならrvalueとして渡されるのでそこは理解してください
674デフォルトの名無しさん
2021/07/11(日) 00:24:04.38ID:YJk6tGcw
>全体的に何が言いたいかよく分からないですが
ヒエッ……このスレは荒れる……
675デフォルトの名無しさん
2021/07/11(日) 00:27:13.08ID:YJk6tGcw
>moveならrvalueとして渡されるのでそこは理解してください
rvalueになるのは移動の右辺であり3のケースでは(3がmoveになったとして)移動元のhogeの実体だが
take_S()に渡るのはmoveされた後のhogeなのでtake_S()の中では問題無くlvalue扱い
676デフォルトの名無しさん
2021/07/11(日) 00:28:49.03ID:YJk6tGcw
しつれい、
誤: take_S()に渡るのはmoveされた後のhoge
正: take_S()に渡るのは&hogeからmoveされてきたhogeの「複製」
677デフォルトの名無しさん
2021/07/11(日) 00:51:20.33ID:5nx6GB9W
リンク先読んだ?
678デフォルトの名無しさん
2021/07/11(日) 00:53:43.57ID:YJk6tGcw
もとから読んでるっつーの;;;
>>677はムーブコンストラクタで構築されたオブジェクトがlvalueでないと思っちゃうタイプ?
679デフォルトの名無しさん
2021/07/11(日) 00:54:17.11ID:5nx6GB9W
3.でmoveは発生しません
詳細はさっきのブログ記事に書いてあります
以上
680デフォルトの名無しさん
2021/07/11(日) 00:55:29.24ID:YJk6tGcw
>>679
どこか指摘できずに逃亡;;;
681デフォルトの名無しさん
2021/07/11(日) 00:57:15.79ID:5nx6GB9W
lvalueをmoveせよ

さて、2. はどうしたらいいだろう。moveコンストラクタを実装したものの、コンパイラは2. の場合には、moveコンストラクタを呼び出してくれない。なぜなら、コンパイラは、プログラマの脳内仕様を読んではくれないからだ。tmpが、その後に使われていないかどうかは、コンパイラは静的に決定できないのである。

そこで、プログラマが意図を伝えてやらなければならない。

X b( static_cast<X &&>(tmp) ) ;

この様に、rvalueにキャストしてやれば、moveコンストラクタを呼び出すことが出来る。
682デフォルトの名無しさん
2021/07/11(日) 01:01:18.54ID:YJk6tGcw
>>679はSのインスタンスhogeを関数void take_S(S) (※void take_S(S&)ではない!)に渡す際に、
take_S()の呼び出し元(この場合main())が
hogeと同じ値を持つインスタンスをtake_S()の引数用領域に構築する必要がある、というあたりからして理解していないのではないか;;;
で、問題にしているコードはリンク先の
>tmpが、その後に使われていないかどうかは、コンパイラは静的に決定できないのである。
には該当しない
683デフォルトの名無しさん
2021/07/11(日) 01:04:39.70ID:YJk6tGcw
なぜなら、今回のケースはコードを見たらワカルからじゃわ;;;
コンパイラは静的に決定できない、と言っているのは停止性問題を解く万能のアルゴリズムが無いことから来ているが、
特殊なケースでは停止性問題は機械的に解ける
今こそその時、

、というあたりからして>>679はちんぷんかんぷんなのではないか……
684デフォルトの名無しさん
2021/07/11(日) 01:11:23.21ID:5nx6GB9W
あーそこがわかってなかったのね
take_Sの仮引数を実引数で初期化する時に同じことが起こるだけですよ?
実引数をrvalue参照とみなしてオーバーロード解決できればmoveで仮引数が初期化される
できなければ(かつlvalue参照として解決できれば)copyで仮引数が初期化される
685デフォルトの名無しさん
2021/07/11(日) 01:24:29.28ID:YJk6tGcw
>>684
藻前の頭が固いだけなんとちゃうか;;;

>実引数をrvalue参照とみなしてオーバーロード解決できればmoveで仮引数が初期化される
この場合(すなわち実引数hogeをtake_S()の仮引数としてコピーした後呼び出し元が実引数hoge()を使わない(ことをコンパイラが機械的に判定できる)ケース)
において、実引数hogeのアドレスをrvalue参照とみなしてはいけないという根拠は?
論理的にはソースコードの意味を変えることなく整合するんだけどそういう最適化はいけないことなの?
686デフォルトの名無しさん
2021/07/11(日) 02:58:15.91ID:YJk6tGcw
んまーとは言ったものの、
【実験1】 >>627のコードをループにしてやって最適化「-O2」にしても"move"にならなんだorz
https://wandbox.org/permlink/2kwbZ4cxyfMDe9VC
結果:
default
--------
copy
0, 1
default
--------
copy
1, 2
...

※ ループにした他、コピコンとムーブコンをそれぞれ「それらしく」実装もしてゐる、
687デフォルトの名無しさん
2021/07/11(日) 02:59:10.66ID:YJk6tGcw
【実験2】 もちろんstd::move(hoge)したらmoveになる
(上記リンク先のコードのDO_MOVE定義のコメントアウトを外してを有効化)
結果:
default
--------
move
0, 1
default
--------
move
1, 2
...

【実験3】 また、中間変数hogeを使わずtake_S(return_S())するとcopyもmoveも起きない
(上記リンク先のコードのUSE_ITM_VARの定義をコメントアウトして無効化)
結果:
default
0, 1
default
1, 2
...
688デフォルトの名無しさん
2021/07/11(日) 03:09:25.47ID:YJk6tGcw
(言い訳1)
実験3のような最適化が許されるのだから、copyをmoveに読み替える最適化も許されるべきだ
規格に照らしてどうなのかはC++規格の専門家の反応待ち

(言い訳2)
今回のケースでGCC様がcopyをmoveにする最適化を拒むのは、単にhogeの使用箇所の分析をサボっているか
(データフロー解析の一環として論理的には十分take_S()呼び出し後の未使用を機械的判定をやれるはずなのに…
、デストラクタのdefault[] のコストでも気にしている可能性が微レ存

(言い訳3)
>>627のコードでmoveになる、と最初に言い出したのは>>609であって漏れではない
むしろ漏れは「場合によってはcopyが起きる」(>>623)と述べてたのでcopy派である
(C++17のRVOが要請するABIについて誤解していた感じなのでであんま大きな声では言えないが
689デフォルトの名無しさん
2021/07/11(日) 13:04:35.11ID:G2C/uXds
>>685
> 論理的にはソースコードの意味を変えることなく整合するんだけどそういう最適化はいけないことなの?

コピーコンストラクタとムーブコンストラクタのどっちが呼ばれたかわかるようにログ出力とかしてたら動作が変わる。
そういう副作用を含めてコンパイラが動作を変えていいケースは >>671 で挙げられたように明示的に規定されていて、
あなたの言うケースはそうではない。
690はちみつ餃子 ◆8X2XSCHEME
2021/07/11(日) 18:47:32.64ID:8K44AFaV
>>688
Copy になるべき場合と Move になるべき場合は条件がはっきりしている。
どちらでもいい場合は無い。

表層上の動作が仕様通りであればどうコンパイルしても良いのが C/C++ なので、
あえて、あくまでもあえてレアケースを挙げるとすれば
(見かけ上の) 動作が Copy でも Move でも同じだとコンパイラが見ぬくことが出来る場合が
あったなら Copy の場面で Move 相当の機械語が生成されることが絶対にないとは言いきれないけども、
Copy でも Move でも同じだと確信できる場合に限られるので動作からはどうせ観測できない。

意味を変える最適化をしていいという唯一のルールがコピー (またはムーブ) の省略で、
その一部が C++17 では必須化されたわけだね。
691デフォルトの名無しさん
2021/07/12(月) 07:46:00.62ID:5HFqt1x5
ある整数がある整数の n 乗であることの判定ってどうするのが良いでしょうか
(n も整数とします)

今までは
x == (int)pow((int)pow(x, 1.0/n), n)
で判定してたんですが、今の自分の環境で x = 4096、n = 6 を渡したら誤判定しました

(int) を round に変えるのを思いつきましたが、コーナーケースがあったら嫌なので、他の良い方法があったら教えてください
692デフォルトの名無しさん
2021/07/12(月) 08:17:32.01ID:K0Wntvol
>>691
諦めてboostの多倍長整数を使う。
693デフォルトの名無しさん
2021/07/12(月) 08:25:49.14ID:Vv9VoiuP
>>691
double y = pow(x,1.0/n);
int iy = (int)y;
iy==y
このほうが多少マシにはなると思うが根本的な解決になってないので
double epsilon = 0.00000001;
y-iy < epsilon;
にするとか
694デフォルトの名無しさん
2021/07/12(月) 09:45:03.47ID:Q0n0f8DA
>>691
どこまで高速化したいのかわからんけど頑張ってn乗計算するとか
https://qiita.com/b1ueskydragon/items/0b8e0c382d782423c6d3
695デフォルトの名無しさん
2021/07/12(月) 10:01:12.57ID:5HFqt1x5
>>692
多倍長整数でどうやるんでしょうか?


>>693
確かに、改めて n 乗する意味なかったですね


>>694
後出しですみませんが、遅くて良いから短くて誤判定のないのが望ましいです
696デフォルトの名無しさん
2021/07/12(月) 10:11:36.07ID:5HFqt1x5
>>693
y の小数部分が 0.9999999998 とかだと失敗しますよね?
iy = round(y) として abs(y - iy) < 1e-12 で判定しようかなと思います
697デフォルトの名無しさん
2021/07/12(月) 10:22:44.45ID:D0qCNAQT
>>690
最後だけ認識おかしい、唯一ではない
698デフォルトの名無しさん
2021/07/12(月) 12:24:08.89ID:uJpO0uZ2
>>697 他に何かあるなら教えて。
699デフォルトの名無しさん
2021/07/12(月) 12:35:12.60ID:4jaglyfV
>>695
boost 多倍長整数 冪乗 で検索。
書くのは色々と面倒だから、解説ページ読め。boost はpowも対応している。
700デフォルトの名無しさん
2021/07/12(月) 17:41:28.01ID:D0qCNAQT
>>698
わかりやすいとこで言えばStrict Aliasing Rulesとか
型が違おうが何だろうが、本来一度書いたものが、次別のポインタ(or参照)を読む時同じ場所だったら、さっき書いた値になってなければならない
・・・んだが、そんなこと守ってたら最適化なんかほとんど出来ないだろ
他にC++の仕様に規定されてなくとも各コンパイラは色々やってる
大抵は問題ないが、ごくまれに意図した挙動になってくれなくて困ることはあるぞ
701デフォルトの名無しさん
2021/07/12(月) 18:26:33.31ID:3yd7dMb1
>>691
>>692
アホな文系の質問にアホな文系が答えるスレ?

どの値が与えられて、その値の条件(範囲、符号、...)は何か
環境は仮定していいのか、(C++の規格範囲内の)すべての環境で正しく動作する必要があるのか
コードに求めるものは何か?(可読性、速度、...)
をはじめからすべて書きなさい
702デフォルトの名無しさん
2021/07/12(月) 18:32:42.82ID:3yd7dMb1
ごく一般的なPC環境で、与えられた整数がintの範囲であれば、
(ある程度の判別を行ったあと)普通に四捨五入で良い

n乗根の候補を求めたあと整数領域でn乗してもいいし
元の数を(割り切れる判別をしながら)候補で割っていってもいいし
与えられた整数が32bitの範囲であれば、2分検索やリニア検索してもいい

アホな文系が理解できる範囲で自分の頭で考えて自分の責任でコードを書きなさい
703デフォルトの名無しさん
2021/07/12(月) 19:47:47.34ID:F4g5ptiT
>>701
そういった諸々の細かい調整を諦めて多倍長整数を使う、ということだよ。
そもそもの要件(n乗判定)でpowを使う乱暴さを考慮すれば、面倒な部分を処理してくれるライブラリを使用するのは有力な選択肢。それを無視して「アホな文系」とは言ってくれる。

ご高説を宣ってくれた後にどんな素晴らしい解説を>>702でしてくれるのかと思ったら、n乗判定にわざわざ割り算を持ち込んだり、対数にも触れずに検索にフッ飛ぶ滅裂ぶり。>>601が混乱するのを笑うために書き込んでいるとしか思えん。

文系、文系と馬鹿にする人間は、人間と会話のできない発達障害が多いのかね?
704デフォルトの名無しさん
2021/07/12(月) 20:05:16.58ID:3yd7dMb1
ヒント
多倍長整数を使っても何も解決しない
705デフォルトの名無しさん
2021/07/12(月) 20:29:50.05ID:4jaglyfV
>>704
なんで解決しないのか解説してもらいたいねぇ。
706デフォルトの名無しさん
2021/07/12(月) 20:34:24.53ID:rFlF3L7g
累乗根は浮動小数点の演算だからだよ
707デフォルトの名無しさん
2021/07/12(月) 20:52:49.79ID:xS7m7lUb
いや累乗して整数同士で比較すりゃええやん
708デフォルトの名無しさん
2021/07/12(月) 21:00:52.19ID:+DCDGa5F
n乗数判定は明らかに整数論の問題なんですがそれは

なお一番簡単な平方数判定でもNPなんで(一発でポンと答えが出る楽な方法は多分)ないです
709デフォルトの名無しさん
2021/07/12(月) 21:13:08.21ID:q3a62lD+
因数分解してハッシュで数えて全部6の倍数なら何かの6乗なんじゃないの


4096=2^12

h{2}→12個

12は6の倍数なので何かの6乗


3*7*3*7*3*7*3*7*3*7*3*7 = 85766121 だと

h{3}→6個
h{7}→6個

両方6だから何かの6乗
710デフォルトの名無しさん
2021/07/12(月) 21:14:32.03ID:M5TNNHP+
累乗根の演算で引数の逆数をどうやって整数で表現するの?
>>691の例で言えば、n=6なら6乗根(=1/6乗)の計算を行なっている
711デフォルトの名無しさん
2021/07/12(月) 21:21:35.61ID:uJpO0uZ2
>>700
未定義動作となる場合はそもそも「意味」が定まらないので「意味を変える最適化」とかいう話にならないよ。
712デフォルトの名無しさん
2021/07/12(月) 22:14:22.14ID:vW8lyXRJ
ひさしぶりにみると
すごく
カオスなスレッド
713デフォルトの名無しさん
2021/07/12(月) 22:33:30.20ID:j4Yh95VG
>>709
>>702 が言ってるのがそれじゃ無い?
> 元の数を(割り切れる判別をしながら)候補で割っていってもいいし
2で割り切れなくなるまで割り、割った回数がnの倍数で無ければNG
3で割り切れなくなるまで割り、割った回数がnの倍数で無ければNG
を繰り返すって事かと(多分)
714デフォルトの名無しさん
2021/07/12(月) 22:51:10.50ID:MoTlox7M
数値計算としては>>693,696がもっとも正統派の方法だよ
素直に累乗根を求めて誤差を評価して判定する
わざわざトリッキーな手段を採る必要性は無い
715デフォルトの名無しさん
2021/07/12(月) 23:38:51.54ID:PjBVtdER
>710
「 累乗の判定」と「 累乗根の演算」をごっちゃにしている?

「累乗根の演算」はあくまで「 累乗の判定」の候補となる整数を
見つける手段の一つで、必ずしも必要ではない。
極端な話、候補となる整数を2から順番に数えて判定しても良い。
まあ、「できるだけコードを簡単に」という話なら素直に累乗根を
使ったほうが良いけど、その時でも(累乗/累乗根計算の誤差の問題から)
「 累乗の判定」を行う必要がある。

>693 >714
よくよく>691を見たら、本質的にはintによる切り捨ての問題だな。
0.5を足して実質的に四捨五入になるようにすりゃいい。

>691の計算を下敷きにするなら
int y = pow(x, 1.0/n)+0.5;//<-これ重要
int z = pow(y, n)+0.5;//<-これも重要だと思う
として、
x == z
を判定すりゃいいんじゃね? 試してないけど。
716デフォルトの名無しさん
2021/07/12(月) 23:48:10.49ID:3yd7dMb1
長々と書いてやっと質問者と同レベルに追いついた
アホな回答者

全部>>702に書いてるし
717デフォルトの名無しさん
2021/07/12(月) 23:51:52.50ID:3yd7dMb1
ある整数やnがマイナスの場合に言及してるのは>>701だけ
質問者も他の回答者もそこまで頭がまわらない
718デフォルトの名無しさん
2021/07/12(月) 23:57:47.66ID:xS7m7lUb
そっかあ
あたまがいいんだね
719デフォルトの名無しさん
2021/07/13(火) 00:17:32.29ID:u8F7J+OY
>>699
いや、
整数 x、y、n が与えられたときに x が y の n 乗であるかどうか判定する
ではなく、
整数 x、n が与えられたときに x が y の n 乗となるような整数 y があるかどうか判定する
ですよ?

多倍長整数なんて出る幕ないでしょう
もしかして y を全ての自然数について全探索するのを想定してる?
高卒?
720デフォルトの名無しさん
2021/07/13(火) 00:31:12.29ID:u8F7J+OY
>>701
質問者自身が int にキャストとか round とか言ってるんだからどう見ても自然数の話でしょ
バカ


>>702
> n乗根の候補を求めたあと整数領域でn乗してもいいし
> 元の数を(割り切れる判別をしながら)候補で割っていってもいいし
なんで今更質問者(>>696)より筋の悪い方法を提案するの?笑

> 与えられた整数が32bitの範囲であれば、2分検索やリニア検索してもいい
これしきの問題で何を探索することがあるんだよバァ~~~カ
つーかわざわざ二分探索とかするならそれこそ桁数めっちゃ多いときの方が有効だろ
なぜ32bitに限った?
721デフォルトの名無しさん
2021/07/13(火) 00:34:18.46ID:u8F7J+OY
>>707
えっっっっ
やっぱり根を探索するつもりだったんだ
ヤベーなお前
722デフォルトの名無しさん
2021/07/13(火) 00:38:55.05ID:u8F7J+OY
>>708
何と勘違いしてんのか知らんが、ここで与えられてる問題は桁数 n に対して明らかに O(n) で解けるだろ
アホ
723デフォルトの名無しさん
2021/07/13(火) 00:45:05.26ID:u8F7J+OY
>>715
質問者より数歩後ろを歩いてるのにすごく堂々としていてかっこいいです
724デフォルトの名無しさん
2021/07/13(火) 00:54:56.07ID:lAJ4enjR
構ってほしいなら昨日のID教えてよ
725デフォルトの名無しさん
2021/07/13(火) 01:00:26.91ID:2F1zpnof
ウーン、質問者!w
726デフォルトの名無しさん
2021/07/13(火) 01:00:52.89ID:MEdkoaBM
>>711
アホだろお前
727デフォルトの名無しさん
2021/07/13(火) 01:02:39.35ID:+UxqO86S
そうでもないよ。
728デフォルトの名無しさん
2021/07/13(火) 01:28:13.49ID:bx8BDdOP
>716
あれ? もしかして>702?
>702は回答としてもヒントとしても全然駄目じゃない?

>695の問題の本質はstd::powの誤差の発生の仕方(プラスマイナス両方出る)と
double -> int キャスト時の誤差切り捨て(0に近づく方に切り捨て)の
ミスマッチなのに、>702ではそんなこと何も言及していないよね。

もしこれで「書いている」と感じるようなら、もっと人間に説明する方法を
勉強したほうが良いと思うよ。
729728
2021/07/13(火) 01:31:47.96ID:bx8BDdOP
自己フォロー
>695の問題の本質はstd::powの誤差の発生の仕方
1.0/nでも誤差発生しているか。std::powとどっちの誤差がデカイかね?
730デフォルトの名無しさん
2021/07/13(火) 01:38:26.00ID:2F1zpnof
もしかしてっつーかモロID一緒じゃん
あとみんな分かってることを周回遅れで「本質」として宣言すんなって
あと安価間違いし過ぎ

ホント迷惑だからもうやめとけ
731デフォルトの名無しさん
2021/07/13(火) 01:39:24.44ID:u8F7J+OY
boost多倍長整数クン顔真っ赤でワロ
732デフォルトの名無しさん
2021/07/13(火) 02:08:48.23ID:FVC0BsAk
この中のどれがQZがコテ外して書き込みしているのか想像したら(*´艸`*)
733デフォルトの名無しさん
2021/07/13(火) 02:10:33.69ID:RS3RIqhF
>>668
これとか完全に荒らしのやり口だもんな
734デフォルトの名無しさん
2021/07/13(火) 02:30:29.04ID:bx8BDdOP
>730
誤差の発生の仕方と誤差切り捨てのミスマッチが問題ということが分かっているなら、
なんで>691への回答でそれを指摘しないの?
この話で重要な「切り捨て」という単語すらスレで3回しか出てきてないし。
それにdoubleに0.5足して/引いてからintにキャストとかCで誤差を扱うときの
定石だろうに、0.5bニいう数字自体bルとんど出てこbネい。

結局>691に助言したいんじゃなくてマウントしたいだけだから当然か。
分かってて余計な説明しかしないんだから、なんとまぁ不親切なやつなんだろうかね。

さて、書きたいこと書いたので風呂入って寝るかね。
735デフォルトの名無しさん
2021/07/13(火) 02:42:44.22ID:2F1zpnof
>>734
round という語が出た回数とその場所も調べたまえ
指摘するまでもなく質問者は>>691,696にして早々それに気付いている
736デフォルトの名無しさん
2021/07/13(火) 03:09:56.56ID:itar1i0e
そもそも>>696の処理であれば切り捨て誤差は発生しない
round() と abs() の2段構えで対策はされてるよ
0.5 を加算するよりずっとスマートな記述だな
737デフォルトの名無しさん
2021/07/13(火) 03:11:08.93ID:itar1i0e
被った
すまん
738デフォルトの名無しさん
2021/07/13(火) 07:55:39.92ID:Fq8PEpca
>>728
四捨五入ってわかるかな?
質問者が分かってることがわかるからそれだけ書けば十分
分かってないのはお前だけ

>>720
小数の誤差を見積もれない、見積もるのが面倒
というなら整数領域だけで答えを導く方法もある
頭の悪い文系にはそういう発想は出てこないかな?

intも整数もマイナスの数を含むんだよね定義的には
範囲を確認するのは当然
質問者も含め勝手な思い込みはバグの元
739デフォルトの名無しさん
2021/07/13(火) 09:33:54.05ID:53YTa3I7
Pow(x, n) ... n乗
Pow(x, 1.0/n) ... n乗根
Pow(x, -n) ... n乗の逆数
Pow(x, -1.0/n) ... n乗根の逆数
740デフォルトの名無しさん
2021/07/13(火) 12:07:43.02ID:WUJYnH4r
>>712
どんなときでも共通するのは声が大きい香具師が勝つ
その場の空気を支配した香具師が勝つ
そしてマスゴミによって印象操作された世界の完成
741デフォルトの名無しさん
2021/07/13(火) 12:13:28.49ID:2uidM73f
>>740
その発想は朝鮮人の考え方
最終的には真実が勝つ
742デフォルトの名無しさん
2021/07/13(火) 12:25:14.06ID:o0P+1kd0
整数の問題なら実数近似せず
y=x^n で(n=1,2,3,4,5....)を比較してくのが基本だろ

高速化するなら多少のテクニックはあるけどたかだか32~64bitの範囲
どうってことない
743デフォルトの名無しさん
2021/07/13(火) 12:33:54.00ID:Sa7UmWqZ
>>742
癪だが>>719が問題を一番正確に表現できているからもう一回よく読め
744デフォルトの名無しさん
2021/07/13(火) 12:34:17.81ID:u8F7J+OY
規格には拘りがあるが数値計算やアルゴリズムの知識はまるでない基地外の狂宴
745デフォルトの名無しさん
2021/07/13(火) 12:49:36.15ID:o0P+1kd0
>>743
えーなんだこれ
つまり
x,nが与えられたときx^1/nが整数かどうか?を示すってことか

y^n=xに変換すればなんにせよ整数の探索問題
実数にする必要もない
746デフォルトの名無しさん
2021/07/13(火) 13:03:24.24ID:u8F7J+OY
>>745
それ、キミの言ってる32~64bitの範囲だと尚更>>696と比べたときにメリットないよね???笑笑笑
747デフォルトの名無しさん
2021/07/13(火) 13:07:00.03ID:u8F7J+OY
上にも「32bitくらいなら探索すれば~」とか言ってるアホいたが、なぜ多倍長でもない限り探索するメリットなんてないってわからないんだキミたちは(泣)
748デフォルトの名無しさん
2021/07/13(火) 13:25:56.92ID:Ag1Q4SdR
>>741
朝鮮人に詳しいんですね!!
感動しました!!!
749デフォルトの名無しさん
2021/07/13(火) 14:47:47.54ID:OYlFgj5O
つまりそれってint型の整数の範囲でn乗がなんであってもεは1E-12で充分だと保証してから使うの?
要するにεは絶対にそれでいいのか?
750デフォルトの名無しさん
2021/07/13(火) 15:54:31.17ID:WUJYnH4r
>>744
QZか?MZか?片山か?
751デフォルトの名無しさん
2021/07/13(火) 18:43:03.58ID:Fq8PEpca
>>747
整数ドメインで行うメリットはいろいろとある

・アホな文系でも理解できる (誤差の見積もりが不要)
・整数演算の方が圧倒的に速い環境 (ARM-M3など)
・浮動小数点演算ライブラリによるコードサイズ増加を防ぐ (チープなマイコン対応)
・doubleが32bitな環境への対応
・64bit整数への対応

選択肢は多いほど良い
752デフォルトの名無しさん
2021/07/13(火) 18:48:11.59ID:Fq8PEpca
> ごく一般的なPC環境で、与えられた整数がintの範囲であれば、
> (ある程度の判別を行ったあと)普通に四捨五入で良い

ごく普通の環境、ごく普通の頭ならこれで終わり
753デフォルトの名無しさん
2021/07/13(火) 19:39:45.09ID:gA5oZqd8
昔"文系"にいじめられてた可愛そうな子なんです
754デフォルトの名無しさん
2021/07/13(火) 19:58:16.23ID:xjdnjcKm
整数演算の最大のメリットがリストに挙がってないのは何でかな
755デフォルトの名無しさん
2021/07/13(火) 20:18:44.42ID:Fq8PEpca
>>753
「アホな文系」≠「文系」

>>754
ぜんぜん最大のメリットじゃないからだな
756デフォルトの名無しさん
2021/07/13(火) 20:20:09.92ID:Fq8PEpca
>>750
団子のことも忘れないでください
757デフォルトの名無しさん
2021/07/13(火) 20:25:35.22ID:xjdnjcKm
>>755
あー・・・何のことか分からねえで言ってるな
758デフォルトの名無しさん
2021/07/13(火) 20:29:09.24ID:OYlFgj5O
最大のメリットって何だ?
759デフォルトの名無しさん
2021/07/13(火) 20:35:59.66ID:xjdnjcKm
からかいたくなったから焦らすぜ
アホかどうかは関係ないことさ
760デフォルトの名無しさん
2021/07/13(火) 22:54:45.19ID:hgVyntNx
>>755
アホな文系に虐められてたんだね…😢
761デフォルトの名無しさん
2021/07/13(火) 23:05:28.90ID:u8F7J+OY
>>752
それは質問者が質問時に自分で言ってることなので……(苦笑)
762デフォルトの名無しさん
2021/07/14(水) 05:08:53.51ID:T6a5Tff4
hoge がビルドされてて hoge.h があるシステムでは hoge を呼び出し、そうでなければ何もしない関数 call() ってどう書くべきてすかね?

これまでは
#if __has_include(<hoge.h>)
#endif
で分岐してたんですが、これだと if に該当しなくてもコンパイラは #if #endif で囲まれてる部分を読み込むし、そこに hoge(); という文があれば「hoge() なんてないよ」というエラーが出ます
該当しない場合は if の中を読み飛ばすとかできますかね?
763デフォルトの名無しさん
2021/07/14(水) 07:18:49.74ID:l4qXoRve
__has_includeはインクルードされたかどうかじゃなくて、
そのファイルが存在するかどうかを判定するやつだからね

hoge.hの中で
#define HOGE_LOADED
して、呼び出し側で
#if defined(HOGE_LOADED)
call();
#endif
って感じかな
764デフォルトの名無しさん
2021/07/14(水) 07:40:27.18ID:l4qXoRve
hoge.hの中を編集できないなら、

読み込み:
#if __has_include(<hoge.h>)
#include <hoge.h>
#define HOGE_LOADED
#endif

呼び出し:
#if defined(HOGE_LOADED)
call();
#endif
765デフォルトの名無しさん
2021/07/14(水) 08:03:52.87ID:wXBQSN5l
>>761
だったらコーナーケースが無いこととその理由を解説したら?
766デフォルトの名無しさん
2021/07/14(水) 11:41:16.26ID:b1WA6GgP
>>765
お前QZだろ
コテ外すな
767デフォルトの名無しさん
2021/07/15(木) 00:20:47.29ID:Fm/xoZyi
>>763
ありがとうございます。

hogeがそのシステムでビルドされてるかどうかの判定は、外部ツールか自分の目に頼らないと無理ですよね?
768デフォルトの名無しさん
2021/07/15(木) 00:40:53.25ID:y+mqrw+D
自作自演w
769デフォルトの名無しさん
2021/07/15(木) 05:48:49.27ID:GxcfqrJG
>>767
> hogeがそのシステムでビルドされてるかどうか
hoge.lib, hoge.dllとかが存在するかどうかを調べればいいだけだとすると
見つかったかどうかをコンパイル時にフラグ(-DHOGE_LIB_FOUND)として渡せれば
C++内で#if defined(HOGE_LIB_FOUND)みたいにして使える。
(これはコンパイル時のことだからC++だけでは普通無理だとおもう)
770デフォルトの名無しさん
2021/07/15(木) 06:31:17.96ID:CtTYgJ1T
C++よりcmakeとかビルドツールのお仕事だと思う
771デフォルトの名無しさん
2021/07/15(木) 09:10:44.89ID:Fm/xoZyi
>>769-770
あざす!
772デフォルトの名無しさん
2021/07/15(木) 18:30:18.77ID:HJCZYZ96
Unifyde Call Syntax FOREVER!!!!!!!
773ハノン ◆QZaw55cn4c
2021/07/15(木) 20:57:38.68ID:kDBlsdNK
>>695
多倍長なら是非是非、こちらを参照あれ、一応 C++ で完結している多倍長演算ライブラリです!
http://2chb.net/r/tech/1434079972/37
774ハノン ◆QZaw55cn4c
2021/07/15(木) 20:58:44.86ID:kDBlsdNK
>>712
なに、いつものことですよ‥‥
775ハノン ◆QZaw55cn4c
2021/07/15(木) 21:00:08.01ID:kDBlsdNK
>>732
残念ながらハズレ
776ハノン ◆QZaw55cn4c
2021/07/15(木) 21:02:01.21ID:kDBlsdNK
>>756
私は忘れていませんよ
777ハノン ◆QZaw55cn4c
2021/07/15(木) 21:02:27.40ID:kDBlsdNK
>>766
ちがうよね‥
778デフォルトの名無しさん
2021/07/15(木) 22:53:15.98ID:2Mj48wOt
QZ現る
779デフォルトの名無しさん
2021/07/16(金) 00:17:25.62ID:37KQZYs3
>>773
積の実装はどのアルゴリズムで?
780ハノン ◆QZaw55cn4c
2021/07/16(金) 04:05:20.77ID:6W3ohAQ3
>>779
筆算法‥‥1 bit × 1 bit を筆算するやりかた、非乗数をシフトしながら乗数のビットが1 のときアーキュムレータに足す、というO(n^2) のものです、「乗法を加法の繰り返しにする」よりはましかと
課題はカラツバ法に直すことですが、まだ出来ていません
781デフォルトの名無しさん
2021/07/16(金) 04:11:57.42ID:37KQZYs3
>>780
では、話になりませんのでそんなもの勧めないでいただけますか
782ハノン ◆QZaw55cn4c
2021/07/16(金) 04:43:48.91ID:6W3ohAQ3
>>781
他の方が優れたソースコードを提示していただければ、私のは引っ込めますけれどもね
783デフォルトの名無しさん
2021/07/16(金) 04:57:11.80ID:N9xjQvrw
多倍長整数ならそれこそboostで良いでしょ
高速な畳み込み演算がしたいなら整数環上でFFTします
つーか精度の観点から言っても速さの観点から言っても一択でしょ(なんでカラツバ?)

そもそも、話の流れからして多倍長整数勧めるのもおかしいし
話わかってないなら出張るなよ

せっかく隔離用の個人スレ (本来ならこれも甚だ迷惑な存在だが) があるんだから、そこで永久に一人でやっててよ
784デフォルトの名無しさん
2021/07/16(金) 05:01:00.91ID:teDb7k99
>>782
https://www.google.com/search?q=%E5%A4%9A%E5%80%8D%E9%95%B7%E6%95%B4%E6%95%B0+FFT
785デフォルトの名無しさん
2021/07/16(金) 05:06:07.44ID:+GJR5l7e
カラツバ法はやばい
せめてフーリエだ 
すでにあるmpirとかいうやつでいいだろ
786ハノン ◆QZaw55cn4c
2021/07/16(金) 05:16:00.53ID:6W3ohAQ3
>>784
ちゃんとコンパイルできるコードはどれですか?
787デフォルトの名無しさん
2021/07/16(金) 05:18:43.72ID:37KQZYs3
ワロチ
既知の事柄のサーベイ能力も低いときた
788ハノン ◆QZaw55cn4c
2021/07/16(金) 05:36:01.54ID:6W3ohAQ3
>>787
サーベイ能力が低いのは認めます、お願いですから、そのままコンパイルすれば動くコードを教えてください
789デフォルトの名無しさん
2021/07/16(金) 05:58:14.27ID:N9xjQvrw
>>783は読めねーのかよ気狂い
790デフォルトの名無しさん
2021/07/16(金) 06:18:07.75ID:qtVJ0qYe
こんなスレまで来てC++の話してるくせにboost知らないってマジかよ…
791デフォルトの名無しさん
2021/07/16(金) 09:21:02.78ID:s4+8hxkm
QZというコテは叩かれやすいからカノンにしたのか
792デフォルトの名無しさん
2021/07/16(金) 09:57:20.84ID:KEhhoM0/
略してQアノン
793デフォルトの名無しさん
2021/07/16(金) 11:50:57.63ID:/EXEczMl
コテを変えても頭の悪さは相変わらずなんだな
まあ中の人が同じなんだから当然だけど
794デフォルトの名無しさん
2021/07/16(金) 12:07:04.82ID:EpGpWKJL
頭悪いのは別にいいんだが、マナー違反が深刻に多いんだよ
・質問に頓珍漢なレスをつける (そもそも回答側に立つのがおこがましいし)
・話題に関係なく自分の創作物を押し付ける
・個人用としてしか機能していないスレを保守し続ける
・都合悪いレスは当然無視
>>668

人間性が劣悪なのが透けて見えるから本当にキツい
795デフォルトの名無しさん
2021/07/16(金) 12:09:38.94ID:EpGpWKJL
全然関係ないが>>259,789が一ヶ月のときを経て同じIDなのって偶然?
それともID被りってプログラム的にもっともらしい理由付けあるんだっけ?
796デフォルトの名無しさん
2021/07/16(金) 13:36:58.69ID:tbXedaSH
フリーランスに立ちはだかる「常駐」の壁。慣例を打ち壊し、
“テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡
https://prtimes.jp/story/detail/DBnPOktyljr
テレワークの一般化により、11月にはテレワーク可能案件83.7%へと増加。
2021年、フリーランスのトレンドは「移住&テレワーク」と予測
https://prtimes.jp/main/html/rd/p/000000045.000050142.html
リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、業務委託契約の求職者と企業をマッチング
https://www.value-press.com/pressrelease/262778
1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の
人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現!
https://www.nishinippon.co.jp/item/o/713384/
新潟県、移住してきたテレワーカー/フリーランスに最大50万円を支給
https://internet.watch.impress.co.jp/docs/news/1287094.html
茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金
https://internet.watch.impress.co.jp/docs/news/1281120.html
長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給
https://internet.watch.impress.co.jp/docs/news/1274735.html
フリーランスが活用できる「最大1,000~3,000万円・補助率50%~75%」の
『ものづくり・商業・サービス補助金』とは?概要や条件を解説
https://freenance.net/media/money/4255/
『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル
https://prtimes.jp/main/html/rd/p/000000051.000010457.html
797デフォルトの名無しさん
2021/07/16(金) 16:34:47.56ID:6/LQ7Fle
>>795
ID被りはわりとまじでたまにある
798デフォルトの名無しさん
2021/07/16(金) 18:25:58.33ID:X0WexOAj
キャッシュの衝突みたいなもんだろ
799デフォルトの名無しさん
2021/07/16(金) 18:26:37.20ID:X0WexOAj
ハッシュなw
800ハノン ◆QZaw55cn4c
2021/07/16(金) 19:28:22.91ID:6W3ohAQ3
>>794
>・質問に頓珍漢なレスをつける (そもそも回答側に立つのがおこがましいし)
いいんです、話題を拡散させるのがねらいだし

>・話題に関係なく自分の創作物を押し付ける
たしかに見たら馬鹿になるかもしれませんから、各自お気を付け遊ばせ

>・個人用としてしか機能していないスレを保守し続ける
いつでも本来の用途に使えるのですよ、有償で問題を片付けるスレ、としてよろしく

>・都合悪いレスは当然無視
無視することによるデメリットを引き受けるのなら当然でしょ?

>・>>668
まあこういうのはやめるようにします、ごめんなさい
801ハノン ◆QZaw55cn4c
2021/07/16(金) 19:32:12.26ID:6W3ohAQ3
>>783
それって裏で GMP を読んでいるだけでは?
そして GMP はアーキテクチャー依存ですよね?
802ハノン ◆QZaw55cn4c
2021/07/16(金) 19:32:52.60ID:6W3ohAQ3
>>789
>>901
803ハノン ◆QZaw55cn4c
2021/07/16(金) 19:38:06.89ID:6W3ohAQ3
>>801
ああ、GMP だけではないようですね MPFR, MPIR MPC とか、でも、どれもアーキ依存にみえますけれども、実際どうなんでしょうね‥‥
804ハノン ◆QZaw55cn4c
2021/07/16(金) 19:41:03.47ID:6W3ohAQ3
>>791
選ブラのデフォを他分野のコテにしたのです、そっちでもキチガイピアニスト扱いですが、まあ、いいか‥‥
805デフォルトの名無しさん
2021/07/16(金) 19:49:34.02ID:+QzOnEF5
ピアノも弾けないのにピアニストとはこれいかに?
806デフォルトの名無しさん
2021/07/17(土) 00:31:45.93ID:uZE7YjUc
>>800
全部開き直りじゃねーか
迷惑だなあ
807デフォルトの名無しさん
2021/07/17(土) 00:37:22.71ID:i16o/xCs
>>795,797-799
ただのIDなら良いんですが、これ両方とも自分のなんですよね……
2ch側で同じ人間の書き込みを紐付ける仕組みがあったとしたら怖くないですか?
しかもその人が RONIN 利用者だったりしたら……
2013年8月の「2ちゃんねる個人情報流出事件」を彷彿とさせますね
808はちみつ餃子 ◆8X2XSCHEME
2021/07/17(土) 03:16:29.97ID:GNWgh0W+
>>807
ID 生成アルゴリズムについて出ている情報はかなり前のものなんで
今でも同じかどうかはわからんけど、わかっている範囲では偶然としか言いようがない。
何度もあれば話は別だが一回あっただけでは偶然ではないと考える人はいないよ。

ただ、 2003 年頃から生のIPアドレスを記録することは明言されているので、
プロバイダの協力があればどのデバイスから書き込んだのかは特定できる。

今では 2ch はいわゆるプロバイダ責任制限法が言うところの
特定電気通信役務提供者に該当するはずなので
必要なときに個人情報を提供できる体制は事実上の義務なんだよ。

書き込み内容に権利侵害があったときに個人情報を提供することで掲示板運営者は
責任を制限されるという法律なので 2ch の側で責任をかぶる覚悟がない限り
書き込み元の情報を残さないという態度は取れない。
809デフォルトの名無しさん
2021/07/17(土) 03:26:32.94ID:+M7J9sQi
別スレでも同じ現象を見た
6/3と7/16はどういうわけか同じIDとなっていたようだ
810はちみつ餃子 ◆8X2XSCHEME
2021/07/17(土) 03:56:04.37ID:GNWgh0W+
>>809
ID の生成元は

・ IPアドレス (のハッシュから一部のバイトを取り出したもの)
・ 毎日更新されるランダム値
・ 板名

をくっつけてハッシュをとったものとされている。
IPアドレスとランダム値が同じであれば ID も同じになる。

たまたまその日が同じランダム値だったのかもね。
811デフォルトの名無しさん
2021/07/17(土) 05:58:32.38ID:OBAxlXTB
範囲for文ってompで並列化できるの?
自作コンテナを走査したいとしたら、なんか満たすべき条件ある?
812デフォルトの名無しさん
2021/07/17(土) 06:23:13.20ID:l7v2uVky
やってみりゃいいじゃん
813デフォルトの名無しさん
2021/07/17(土) 13:21:42.77ID:0jiuXQpQ
chrono で測ったn並列プログラムの実行時間が実世界で経過した時間のn倍になってる気がして、これが正しいかどうか調べたいんですが、ストップウォッチで測って比較するしかないですか

ちなみに並列化はopenmpでやってます
814デフォルトの名無しさん
2021/07/17(土) 16:14:23.13ID:eTC1af8g
バカノンノン
815デフォルトの名無しさん
2021/07/17(土) 16:18:43.54ID:DE+0Jqb8
>>813
https://letmegooglethat.com/?q=%E6%99%82%E9%96%93%E8%A8%88%E6%B8%AC+c%2B%2B
816デフォルトの名無しさん
2021/07/17(土) 17:58:37.00ID:z0Sx2PLf
え、chronoなり何なりで測った時間がおかしい、って話じゃないの?
そら検証したけりゃ別スレッドやプロセスで測るなりストップウォッチなりだろう、と思ってたんだが

ただまぁ経過時間の加算とかでおかしなことになってるのを真っ先に疑うべきだね
817デフォルトの名無しさん
2021/07/17(土) 19:11:08.33ID:cBM+BeK7
時間測定クラスはシングルトン使ってるよね?
どうせ複数の箇所で測定したのを加算してるってオチでは
マルチスレッドならmutexか何かでnewの所をロックしないとおかしくなるし
818デフォルトの名無しさん
2021/07/17(土) 19:36:36.54ID:txbUHFZy
実行時間といってるのがCPU時間のことならn並列でn倍になるからね
メインスレッドのCPU時間だけを見るべき
かんたんなんだしストップウォッチで測ればいいじゃん
819デフォルトの名無しさん
2021/07/17(土) 22:27:23.07ID:gI+aCVlx
スレッド毎にcronoした結果をnスレッド分足したらn倍になりそう……
820デフォルトの名無しさん
2021/07/17(土) 22:30:43.79ID:gI+aCVlx
WindowsならGetTickCount()でも使うところだけど
(実質15.6 ms(PCによっては10 ms?)を超える分解能にならないのはおくとして)
C++標準でms単位のカウンタってあるます?
821デフォルトの名無しさん
2021/07/17(土) 22:44:14.11ID:z0Sx2PLf
chronoで分解能決めれるやんけ
822ハノン ◆QZaw55cn4c
2021/07/18(日) 00:41:49.86ID:9YAoR/6C
>>691
私も試してみましたが、結局 >>694 の言うとおり実際に n 乗して験算するしかないかなぁ‥‥と思いました

私の環境でも、x == (int)pow((int)pow(x, 1.0/n), n) では散々 https://ideone.com/AXH87Q
次のようにすると、わりといい感じです https://ideone.com/NM2btt

せっかく多倍長演算の話が出たので、もしも暇とやる気があったら boost::multipricise と GMPの c++ 記述と、例の自作のやつとに載っけて試してみます
823デフォルトの名無しさん
2021/07/18(日) 02:35:57.32ID:pNZOhAQw
>>818
これ

たとえばmain()の最初と最後のchrono::system_clock::now()の差で時間を計測してると仮定して、その間でnスレッド走らせてそれぞれt秒かかったとしたら結果はnt秒になる
824デフォルトの名無しさん
2021/07/18(日) 10:01:58.21ID:WbmfjGIN
>>823
>その間でnスレッド走らせてそれぞれt秒かかったとしたら結果はnt秒になる
なんで?
chrono::system_clock::now()は現在時刻を返すと書いてある
仮に消費したCPU時間だとしても、スレッドの本数分ではなく高々論理コア数倍までで収まりそうに思ーう
825デフォルトの名無しさん
2021/07/18(日) 11:33:46.95ID:/c4qfmiI
まあCPU時間と勘違いしてるんだろうね
826デフォルトの名無しさん
2021/07/19(月) 13:10:18.03ID:whuO5wb3
g++で、-static オプションを付けたときにリンクされるライブラリのパスってどうやって指定するんですかね?

システムにインストールされてる glibc が不具合を抱えてるので、$HOME/local に別バージョンの glibc をインストールしました
動的リンクの場合は -Wl,--dynamic-linker=$HOME/local/lib/ld-linux-x86-64.so.2 を渡すことで問題なくコンパイル・実行できたのですが、静的リンクを使用する場合どうしたら良いのかわかりません
827デフォルトの名無しさん
2021/07/19(月) 17:28:07.02ID:ddBZ8vH3
>>609
一番上はコピーだぞ
828デフォルトの名無しさん
2021/07/20(火) 07:03:16.39ID:ouQfIwtX
>>826
これLinux板のくだ質とかで聞いた方が良いですかね?
スレチでしたら移動します
829デフォルトの名無しさん
2021/07/24(土) 08:11:39.12ID:jjSVv9BX
>>811
普通にできるよ
> 範囲for文のOMP並列化


ランダムアクセス不可能な自作クラスは常識的に考えて無理だろうけど
詳しい人いたら教えてくんろ
830デフォルトの名無しさん
2021/07/25(日) 16:30:34.85ID:m1WCNOY9
全員死んだの?
831デフォルトの名無しさん
2021/07/25(日) 17:00:04.04ID:DW9TtY2c
g++ があんまり本気じゃなくて萎えるんだよね
並列化のとこ
832デフォルトの名無しさん
2021/07/25(日) 17:20:27.49ID:Wj/gwJho
誰がメンテしてるかわからんがリナスも当時g++の出来の悪さにぶちギレて依頼、C++はクソの一辺倒を貫いてる
833デフォルトの名無しさん
2021/07/25(日) 17:26:02.39ID:Wj/gwJho
firefoxとかもそうだけど、有志がサポートするソフトってそれをメンテしている人間が無能の働き者だと最悪ゼロから作り直さないと逝けなくなるところが怖いところやな
834デフォルトの名無しさん
2021/07/25(日) 17:31:37.94ID:DW9TtY2c
元々はハッカーが「気合い入れる」祭りみたいなもんだったのに
いつしか過去バージョンとの互換性がどうたらで硬直化していった
そういうところはマイクロソフトやIBMに任しときゃいいのに
リスクを承知で面白みというメリットを捨てちまいやがって
835デフォルトの名無しさん
2021/07/25(日) 17:34:19.95ID:Kn/tUAQv
> メンテしている人間が無能の働き者

怖がらなくて良いぞ
彼らはお前より有能だから

そして世間を怖がらせてるのは
自分の実力も知らず
相手の実力も知らない
そんなお前なんだよ
836デフォルトの名無しさん
2021/07/25(日) 17:44:55.94ID:Wj/gwJho
>>835
元開発者な方ですか?
効いてるw効いてるw
837デフォルトの名無しさん
2021/07/25(日) 20:29:47.07ID:f5YSZ9Lg
>>831
gccにはC++に並列ライブラリが入る前からParallel Modeがあって、
今はそこをIntel TBBに丸投げしてるだけだしな
誰かが本格的にテコ入れするまではこのままだろうね
838デフォルトの名無しさん
2021/07/26(月) 18:54:55.35ID:poXtKo35
GCCはモノリシックにこだわってグチャグチャだし
かと思えばHurdはマイクロカーネルにこだわって死産だし
あいつらアホなんじゃないかと思うことはある
839はちみつ餃子 ◆8X2XSCHEME
2021/07/26(月) 20:56:05.01ID:afAoM3cN
GCC はコードの構成が悪いことは百も承知で長期的にソフトウェアの自由を守るために必要だという戦略なんだよ。
当初からの目的通りに活動しているだけ。
まあその戦略で目的をはたせるかどうかは結果を見ないとわからんけどな。
840デフォルトの名無しさん
2021/07/27(火) 15:50:56.07ID:P6e91jkT
なんで急に書き込み減った?
みんなバカンスとってんのか?
841デフォルトの名無しさん
2021/07/27(火) 16:56:16.02ID:GsN3P1i6
ヒント:
じつはこのスレ、大勢いるようで3人ぐらいしかいない
842デフォルトの名無しさん
2021/07/27(火) 16:59:12.02ID:/kLodUqV
ハノンの書き込みは頭悪いからすぐわかるしな
843ハノン ◆QZaw55cn4c
2021/07/27(火) 20:34:35.25ID:RHl6eLWp
でも gcc が c での記述を止め、c++ で記述されることになったのには失望しました‥‥
844ハノン ◆QZaw55cn4c
2021/07/27(火) 20:36:17.62ID:RHl6eLWp
>>842
その「ハノン」という呼び方は本意ではないとピアノスレでも散々力説したのだけれども、とうとう自らハノンと名乗るまでに落ちぶれてしまいまとさ、めでたしめでたし‥‥‥
845デフォルトの名無しさん
2021/07/27(火) 20:50:38.01ID:P6e91jkT
同じ奴がたくさん質問してる感じはあるが、回答者はバラバラだと思ってたけどなあ
846デフォルトの名無しさん
2021/07/27(火) 23:56:35.56ID:Ke8m4iQ/
>>843
コンパイラを走らせる環境はリッチだから問題ない
847デフォルトの名無しさん
2021/07/28(水) 10:58:41.57ID:37rNIz61
翻訳環境の怪物化はすごいね
848デフォルトの名無しさん
2021/07/28(水) 14:40:45.53ID:JLxqMRcd
組み込み機器も性能があがっているのだから、理屈のうえではC++の導入コストはさがっているとはいえ
不具合が起きた時に全部自分で対応しなければならない苦行から解放されるわけではないから
組み込み系の低レベル開発者がC++を忌避するのは理解できる
849デフォルトの名無しさん
2021/07/28(水) 15:10:15.29ID:5zPBGnUX
>>841
5ch全体でも5人くらいしか居ないよ。
850デフォルトの名無しさん
2021/07/28(水) 19:18:33.88ID:NVIQ8eLn
せっかくC++使っているのにイベントバインディングやデリゲートは止めて欲しいな。
クリーンアーキ風から言えばコンストラクターでのディペンデンシーインジェクションにして欲しい。
Cならセルフイベント関数ポインターとコールバックイベント関数ポインターでOKだが、C++ではウザイ。
組込みに生きている身として、最近、富に思う。
851デフォルトの名無しさん
2021/07/28(水) 20:28:41.06ID:NVIQ8eLn
連投でスマソ
まぁ Ted Faison風のEvent-BasedはC++では終わったという事だわな。
Cでは有効だが、インターフェースの機能があるC++ではレポジトリーの概念が大事という事。
852デフォルトの名無しさん
2021/07/29(木) 19:38:48.60ID:N9xjQvrw
>>829
返信遅れましたありがとうございます


1. メンバ関数としてbegin()、end()を持つ
2. begin()、end()が間接参照演算子、インクリメント演算子、不等価演算子を持つクラスか構造体を返す
という条件を満たすクラスか構造体の範囲for文による走査をopenmpで並列化できたらと思うのですが、何かテクニックないでしょうか
853ハノン ◆QZaw55cn4c
2021/07/29(木) 20:14:33.88ID:6W3ohAQ3
>>850
組み込みの人が DI を語っておられるとは‥‥
854デフォルトの名無しさん
2021/07/29(木) 21:38:43.31ID:teDb7k99
またID被ってる
855デフォルトの名無しさん
2021/07/30(金) 09:02:20.45ID:7heefpFa
ハッシュの衝突くらいで騒ぐかよ
856デフォルトの名無しさん
2021/07/30(金) 11:20:47.05ID:+rE3rJXm
IPアドレスと日付から算出されるらしいけど結構、衝突するじゃん
体感的にはかなり偏ってて正常なハッシュアルゴリズムとは思えない
857はちみつ餃子 ◆8X2XSCHEME
2021/07/30(金) 15:01:08.41ID:qMgk6unv
>>856
ハッシュの分散はこの場合は関係ない。 乱数に異常な偏りがある。

これはただの想像だけど、仮想環境の構築にミスがあるんじゃないだろうか。
Docker のスナップショットを作るときに乱数生成器の状態をキャプチャしてしまって
再起動が入ると乱数列も最初から……みたいな。
858デフォルトの名無しさん
2021/07/30(金) 18:09:27.82ID:+rE3rJXm
>>857
乱数ではないと思うよ
なまじ乱数だと、その乱数値を覚えておく保存領域がサーバー上に必要になって手間が増える
859デフォルトの名無しさん
2021/07/30(金) 19:39:15.89ID:ftRMaVHk
>>856
正常なハッシュアルゴリズムって何?
正常と異常の境界があるの? SHA1は異常なのか?
860デフォルトの名無しさん
2021/07/31(土) 05:54:28.89ID:cWLU96cE
偏りがあったら異常やんけ;;;
例えば0~LONG_MAXを1バイトにするハッシュ関数が0x1Fを全く出力しないとか、
0~LONG_MAX/2が全て0x11になるとかだったら>>854でなくともさすがに違和感をおぼえるであろう、
861デフォルトの名無しさん
2021/07/31(土) 07:49:26.34ID:cWLU96cE
ミシュラン2つ星の実力派レストラン「シングルスレッド(Single Thread)」
https://www.foodee.jp/report/restaurant/fusion-cuisine/new-american-cuisine/3338/
862デフォルトの名無しさん
2021/07/31(土) 08:09:20.77ID:t9HNV453
>>860
ハッシュと一様乱数を混同してるか?
863デフォルトの名無しさん
2021/07/31(土) 10:32:59.95ID:XdxgF0zQ
結果よりも速度を求められたり、頻出値だけより広く分布させたい場合もあるだろうから要件次第ではあるけども、
一般的には、期待される入力に対して一様に分布していたほうが、衝突確率が下がるのでより望ましい結果と言えるんじゃないの?
864デフォルトの名無しさん
2021/07/31(土) 10:52:18.34ID:o9ang7qv
望ましい、というのは、正常と異常の境ではないな
865デフォルトの名無しさん
2021/07/31(土) 11:19:08.67ID:N/3vvIjJ
最大1000レスまでしか書き込めない同一スレッド上で別人同士がID衝突する確率は宝くじ1等に当たる確率よりも低いと期待できるが、現実はそうなってない
866デフォルトの名無しさん
2021/07/31(土) 12:14:03.01ID:cWLU96cE
つくづくボンクラな>>862、、、
衝突は極力避けたいんだろ?
>一様性
>良いハッシュ関数は、考えられる入力範囲が出力範囲全体になるべく一様に分布するようにマッピングを行う。
867デフォルトの名無しさん
2021/07/31(土) 12:18:58.07ID:xfGVog4d
本当にIPアドレスが衝突してる可能性もある
同じマンションとかいう話だけでなくIPoEだと共有してるとかあったはず
技術力なさそうだから5ch側の作りが悪いんだろうけど
868デフォルトの名無しさん
2021/07/31(土) 12:23:58.11ID:t9HNV453
>>866
良いとか望ましいなんておまえさんの個人的な主観が聞きたいんじゃねえ
ハッシュにおける正常と異常の境界を聞いている
知らないんなら答え(たふりをす)るな
869デフォルトの名無しさん
2021/07/31(土) 12:30:10.08ID:cWLU96cE
>>868って、角度を定規とコンパスで3等分しようとするタイプ?
870デフォルトの名無しさん
2021/07/31(土) 12:42:38.84ID:t9HNV453
ここはC++スレだ
人格攻撃は余所でやれ
871デフォルトの名無しさん
2021/07/31(土) 12:49:39.86ID:i9NDIoMF
>>868
そんなの設計仕様次第だろ。

SHA1は当初の仕様を満足できない脆弱性を抱えているから、(仕様に対して)異常ということができる。
872デフォルトの名無しさん
2021/07/31(土) 13:04:48.82ID:t9HNV453
弱衝突耐性を破る方法が見つかったか否かが境界というのはおかしいだろ
未発見であることと存在しないと証明されていることは違う
873デフォルトの名無しさん
2021/07/31(土) 13:10:19.44ID:mrismh1j
>>872
なんでおかしいのかちゃんと反論しろよ。

SHA1が当初仕様を満足できていないのは間違いなく、仕様を満足できていない以上「(仕様に対して)異常」だろ。
874デフォルトの名無しさん
2021/07/31(土) 13:17:04.19ID:t9HNV453
なんでおかしいのか2行目に書いたんだが
話にならない人なのか
875デフォルトの名無しさん
2021/07/31(土) 14:14:47.38ID:N/3vvIjJ
>>868
> ハッシュにおける正常と異常の境界を聞いている

お金を出す人が境界を決めるだけのこと
技術論の出る幕なし
876デフォルトの名無しさん
2021/07/31(土) 14:36:13.48ID:t9HNV453
おまえさんが技術論できないのはわかった
こちらもこれ以上は追求しない
877デフォルトの名無しさん
2021/07/31(土) 14:38:40.17ID:cWLU96cE
>>870
人格攻撃とみなす前に、
入力範囲と出力範囲が同じハッシュ関数において
一様性を満足しないものの衝突耐性が
一様性を満足するものの衝突耐性に勝るケースを一つでも挙げてみたらいかがですかね……

入力の発生頻度に偏りがありハッシュ関数をそれにチューニングする場合はあり得るが、
入力の発生頻度を限定する話はここまでで出ていないから無いものとして
878デフォルトの名無しさん
2021/07/31(土) 14:45:30.93ID:t9HNV453
>>877
ハッシュの正常と異常の境界には関係ない話だな
879デフォルトの名無しさん
2021/07/31(土) 14:46:37.30ID:cWLU96cE
>>878
無関係かどうかを論ずるには「正常と異常」の定義を
主観非依存な形で明らかにしていただけませんと、
880デフォルトの名無しさん
2021/07/31(土) 14:49:27.72ID:t9HNV453
>>879
それは>>856に俺が聞いていることだ
881デフォルトの名無しさん
2021/07/31(土) 14:52:41.19ID:cWLU96cE
>>856とかまさにハッシュの一様性の問題でしかないのでは……
882デフォルトの名無しさん
2021/07/31(土) 14:57:10.54ID:t9HNV453
衝突耐性と一様性は関係ない
・・・て、これハッシュの初歩の初歩だぞ
883はちみつ餃子 ◆8X2XSCHEME
2021/07/31(土) 15:09:12.92ID:zwQwPVDS
>>858
前提として、 ID 生成のおおまかな手順は >>810 のようなものになってる。
使われているハッシュアルゴリズムは古い資料では MD5 ということになっているから、
変更されているとしても MD5 よりは良い性質のものが選ばれていると思う。

ハッシュの衝突が頻繁に起こると考えるよりは生成元のバイト列が同じだったと考えるほうが自然。
884デフォルトの名無しさん
2021/07/31(土) 15:14:21.76ID:wqQpURd2
同一人物の確率が高いですね(・∀・)ニヤニヤ
885デフォルトの名無しさん
2021/07/31(土) 16:43:06.11ID:LRA0vGhm
最近は濃度濃いからな
886デフォルトの名無しさん
2021/07/31(土) 17:18:39.66ID:egUJWjj5
左辺値からmove君今日もイキイキしてんな
887デフォルトの名無しさん
2021/07/31(土) 17:34:47.35ID:t9HNV453
匿名掲示板で同一人物かどうとかってアホかお前ら
888デフォルトの名無しさん
2021/08/01(日) 00:17:38.34ID:fSdDKS6o
>>882
衝突耐性ってのは衝突しても耐えられる性能ってこと?
一様であれば普通は衝突確率自体低くなりそうな気がするけど
889デフォルトの名無しさん
2021/08/01(日) 05:57:41.62ID:4Ph4Dvnc
ハッシュの衝突を故意に起こす攻撃への耐性
強衝突耐性と弱衝突耐性がある
890デフォルトの名無しさん
2021/08/01(日) 11:47:47.11ID:boMMlR1G
>>867
たまたま近所に住んでて出入りしてる店のWiFiが同じとかな
891デフォルトの名無しさん
2021/08/01(日) 11:50:13.10ID:boMMlR1G
>>877
>入力範囲と出力範囲が同じハッシュ関数

5ch/2ch とは関係無い話をなぜするんだ?
892デフォルトの名無しさん
2021/08/01(日) 13:05:26.18ID:RrS7g+U3
>>867
>>890
野良ProxyやNordVPNの様なサービス経由か
893まあ俺が言うのもなんだがw
2021/08/01(日) 15:28:14.61ID:BgB9X1kX
>>867
クライアントのIP被りと5chサーバーの作りになんの関係が?
技術力ないなら黙ってた方がいいかと
894デフォルトの名無しさん
2021/08/01(日) 15:29:14.00ID:pw89eIDb
>>886
レス番で言うと誰が誰?
895デフォルトの名無しさん
2021/08/01(日) 17:18:44.88ID:ebmqBspL
>>882
その主張は>>877の例を挙げられないのなら偽ですなあ~~
どんな教科書をどういう読み方してるのか知らんが
896デフォルトの名無しさん
2021/08/01(日) 17:20:28.87ID:ebmqBspL
>>888
強衝突耐性 = (>>877で言うところの)入力範囲
(ハッシュの元になるやつ。5chのハッシュの例でいうと>>810のデータの集合)
からいっぱい集めねば同じハッシュ値(5chの例で言うとID)にならないという特性
(衝突を起こすための仮定が多い(強い条件)から「強」衝突耐性と言うのだと思われ、

弱衝突耐性 = 出力範囲(5chの例で言うとID)から任意に選んだ1つ
から入力範囲を再現しにくいという特性
(衝突を起こすための仮定が少ない(弱い条件)から「弱」衝突耐性と言うのだと思われ、

弱衝突耐性が>>856の問題提起(ID被り)に直接対応する
897デフォルトの名無しさん
2021/08/01(日) 17:21:50.37ID:ebmqBspL
ごめ訂正orz
正: 強衝突耐性が>>856の問題提起(ID被り)に直接対応する

で、ハッシュに偏りがあったら、強弱どっちの耐性も一般に低下する
>>860の例でハッシュ関数が0x1Fを出力しなかったら、0~LONG_MAXからN個ランダムに選んで
ハッシュ化したら同じハッシュになる確率が256/(LONG_MAX+1)から255/(LONG_MAX+1)に低下する(弱衝突耐性の劣化
等、

>>886
単発レス君は何か言いたいことがあれば言っても良いのだぞ?匿名掲示板やし……
898デフォルトの名無しさん
2021/08/01(日) 17:23:06.81ID:4Ph4Dvnc
>>895
「関係ない」という主張への反駁は
関係あることを示すだけの簡単なことなのに
899デフォルトの名無しさん
2021/08/01(日) 17:28:09.09ID:ebmqBspL
>>898
>>897
といっても確率計算をまつがえたのでそこは訂正汁orz、
>>860の例でハッシュ関数が0x1Fを出力しなかったら、0~LONG_MAXからN個ランダムに選んで
ハッシュ化したら同じハッシュになる確率が
 1 - (1-256/(LONG_MAX+1)^N
から
 1 - (1-255/(LONG_MAX+1)^N
に低下し、弱衝突耐性が劣化
900デフォルトの名無しさん
2021/08/01(日) 17:51:30.09ID:4Ph4Dvnc
何で弱衝突耐性に確率が出てくるんだよ
901デフォルトの名無しさん
2021/08/01(日) 17:52:27.09ID:bBrAMy8u
ハッシュ関数への入力の時点で衝突してるんだから、MD5だのSHA1だのは関係無い

>>810の時点で指摘されているんだが、いつまでこの無意味な話を続けるつもり?
902デフォルトの名無しさん
2021/08/01(日) 18:01:11.28ID:ebmqBspL
>>900
入力範囲のサイズ>>出力範囲のサイズである以上、
全部の入力を考えたら必ず衝突する & 入力範囲(一般に天文学的サイズ)の総当たりは一般遂行不能なので
確率評価するしかないからじゃゃわ;;

もちろん、特定の論理的操作で弱点をピンポイントで突けることがわかった場合は
ハッシュの衝突耐性の見積もりが確率ではなく論理的に下方修正されるが、そうなった時はそのハッシュが寿命を終えたとき、、、

ガチで基本がわかってない>>900、、、大丈夫なのか、、、
903デフォルトの名無しさん
2021/08/01(日) 18:05:17.08ID:4Ph4Dvnc
> ガチで基本がわかってない

弱衝突耐性とは何かがわかっておらず
正解を書いていながら正解として使えてないやつに
言われたかねえなw
904デフォルトの名無しさん
2021/08/01(日) 20:28:45.05ID:c9gBXIbe
>>895
入力バイト列の先頭64バイトを返す「ハッシュ関数」は一様だが衝突耐性は無い
入力バイト列のSHA-256にパディング32バイトを加えて返す「ハッシュ関数」は一様ではないがSHA-256と同レベルの衝突耐性を持つ
905デフォルトの名無しさん
2021/08/01(日) 20:57:55.63ID:jK0t+VIo
>>872 >>874
どう考えたら
> ハッシュにおける正常と異常の境界を聞いている
に対する回答
> そんなの設計仕様次第だろ。SHA1は仕様を満足できないから異常
への反論が
> 弱衝突耐性を破る方法が見つかったか否かが境界というのはおかしいだろ
> 未発見であることと存在しないと証明されていることは違う
になるんだよ。
『設計仕様を正常と異常の境界とすること』と『異常(脆弱性)の不存在証明の有無』は全く関係ない。
SHA1の例でいうと、衝突攻撃の研究によってSHA1の正常・異常の状態が『正常かどうか不明』→『異常』に変化しただけの話で、『境界』と『不存在証明の有無』は矛盾しない。
議論するなら『設計仕様を正常と異常の境界とすること』に対する問題点や矛盾を示せよ。論点ずらしなんかしないで。

あと、>>872は弱衝突耐性(原像計算困難性)云々言っているが、なんで弱衝突耐性?大本の議論(ID被り)からすりゃ強衝突耐性のほうが重要だし、SHA1で問題になっているのも衝突攻撃に対する脆弱性だろ。SHA1に対する原像攻撃って成功していたっけ?
もしかして>>872は弱衝突耐性と強衝突耐性の違いも知らないでハッシュを語っているのかね? Wikipediaにすら解説が載っているのに。
906デフォルトの名無しさん
2021/08/01(日) 21:29:10.73ID:4Ph4Dvnc
ウィキを3時間読んできたのね、ご苦労さん
もっと簡単化した文章が書けるように消化してから書いてね
俺、ここでウィキとやりあうつもりはないから

# ちな、俺はウィキのとある記事の中の人
907デフォルトの名無しさん
2021/08/01(日) 22:09:15.95ID:DfQPo4se
     カタカタ
  || ̄ Λ_Λ
  ||_(Д`; ) 「なに?このスレ・・・」
  \⊂´   )
    (  ┳'
908デフォルトの名無しさん
2021/08/01(日) 22:29:39.30ID:jK0t+VIo
>906
三時間……? なんのこと? なんか幻が見えていない?
>905に反応するなんて、もしかして>906は>872 >874だったりするのかね。
弱衝突耐性を理解できていないアホとハッシュの話をしても仕方がないが……


> ちな、俺はウィキのとある記事の中の人
Wikipediaの記事を書いているなら『ウィキ』とかアホな言い方するなよ。
それとも文脈無視して本来の意味の『ウィキ』で使っているのかね。

用語をいい加減に使うヤツは議論や情報共有の邪魔になるゴミ。
Wikipediaで『ウィキ』ぐらい調べてから使えよ。

>907
いつもの楽しい5chのスレです。
909デフォルトの名無しさん
2021/08/02(月) 08:57:10.51ID:59KH06XU
聞きかじったことをリピートしてるだけで
自分なりに熟れてないの見え見えだからw

くだらん言葉尻でもいいからと
あら探しに必死な姿は恥の上塗りなだけだぜ
910デフォルトの名無しさん
2021/08/02(月) 11:14:55.63ID:6pXxEptq
君もしかして天に唾するクンか?
911デフォルトの名無しさん
2021/08/02(月) 11:23:38.63ID:59KH06XU
弱衝突耐性という用語を使いだしたのは俺だが
「SHA1は仕様を満足できない」と言い出したのはおまえさんだぜ

俺はただ正常と異常の境界は何かと聞いただけ
そこへ弱衝突耐性を意味する話をしだしたのがおまえさんだ
ここからそもそも頓珍漢なんだがw
912デフォルトの名無しさん
2021/08/02(月) 11:38:15.60ID:zqXMuOMM
>911 >872 >874
どう考えたら
> ハッシュにおける正常と異常の境界を聞いている
に対する回答
> そんなの設計仕様次第だろ。SHA1は仕様を満足できないから異常
への反論
> 弱衝突耐性を破る方法が見つかったか否かが境界というのはおかしいだろ

の流れで

>そこへ弱衝突耐性を意味する話をしだしたのがおまえさんだ

という話になるんですかねぇ。
弱衝突耐性の話を出してきた>872は俺じゃないよ。
913デフォルトの名無しさん
2021/08/02(月) 12:23:45.40ID:59KH06XU
いーや弱衝突耐性の出してきたのは>>871
奴は弱衝突耐性という用語を知らなかったようだが
間違いなくその話をしている
914デフォルトの名無しさん
2021/08/02(月) 12:25:06.19ID:pbh5hStk
ハノンがコテ隠して発言してて草
915デフォルトの名無しさん
2021/08/02(月) 12:42:51.63ID:pSyuAavC
>>913
歴史改竄するなよ。
なんでSHA1の脆弱性の話をしているのに弱衝突耐性の話になるんだよ。

もしかしてSHA1の脆弱性が弱衝突耐性に関するものだと勘違いしている?
それなら一連の発言の辻褄が合ってくるけど、まさかね。
916デフォルトの名無しさん
2021/08/02(月) 12:45:20.48ID:59KH06XU
>>915
ほうほうw
ではSHA1の脆弱性が何だと思ってるんだ、おまえさんは?
917デフォルトの名無しさん
2021/08/02(月) 12:56:24.24ID:pSyuAavC
>>916
お前は>>906でいちゃもんつけている>>905を読むという誠実さすら無いのか。

バカな上に傲慢とは救いようが無いな。
918デフォルトの名無しさん
2021/08/02(月) 13:05:07.60ID:6pXxEptq
何スレやねん
move論争の方がまだマシだったな
919デフォルトの名無しさん
2021/08/02(月) 13:28:50.14ID:59KH06XU
>>917
やーい答えらんねえw
ブラフまで幼稚とはどこまでも無能なやつだな
920デフォルトの名無しさん
2021/08/02(月) 14:17:15.73ID:knlOee4h
  ________
  | ______ / ̄ ̄ ̄ ̄ ̄ ̄\
  | |       / ⌒  ー、  :::::::::::U:\
  | |       /( ○)}liil{( ○)   ::::::::::::::|   なにこのスレ・・・
  | |      .|U⌒(__人__) ⌒   ::::::U::::|
  | |       |   |r┬-| U...:::::::::::::::::::/
  | |____ ヽ  `⌒´.....:::::::::::::::::::::::<
  └___/ ̄ ̄      :::::::::::::::::::::::::|
  |\    |
921デフォルトの名無しさん
2021/08/02(月) 15:45:48.15ID:59KH06XU
ケンカ成分入れたのはこいつ
>>866
922デフォルトの名無しさん
2021/08/02(月) 16:50:20.92ID:ENgx1DZA
最初にSHA1の話を始めた >>859 が荒れた原因だよ
独りよがりで読解力がないことがたった二行で伝わってくる
923デフォルトの名無しさん
2021/08/02(月) 17:03:35.19ID:ENgx1DZA
ダイジェスト長約48bit相当しかない5chのIDをなぜかダイジェスト長160bitのSHA1に関連付けて語りだしたアホがすべての原因
924デフォルトの名無しさん
2021/08/02(月) 17:07:16.03ID:ENgx1DZA
宝くじ一等当選確率を1千万分の1とすると、log(10000000)/log(2) = 23.253496664... つまりダイジェスト長は約23bitに相当する
925デフォルトの名無しさん
2021/08/02(月) 18:28:05.17ID:J7wQxpF0
>>919
あらら、幼児退行したか。
議論もレスバも意味ないな。相手にするだけ無駄か。
ロクに調べずに、SHA1の脆弱性の話で弱衝突耐性とか言い始める無能だからなぁ。

とりあえず>>919はコテハン付けとけ。NG設定するから。
926デフォルトの名無しさん
2021/08/02(月) 18:57:52.80ID:gLOyL8sZ
あわしろ氏は、そうは言ってなかったな。
927ハノン ◆QZaw55cn4c
2021/08/02(月) 19:53:00.83ID:cVX0s0Vd
>>914
わたしじゃないですよ!あとハノン呼ばわりは本意じゃないから止めて!
928デフォルトの名無しさん
2021/08/02(月) 21:26:49.50ID:flJzbmIi
名乗っておいて呼ぶなとは一体…
929デフォルトの名無しさん
2021/08/03(火) 00:20:17.34ID:oJ5wTgbl
質問です
クラス型の変数を関数内で宣言してreturnする関数があって、別の関数からクラス型の変数の宣言と同時にその関数呼び出したときに、moveコンストラクタをdeleteしてるとコンパイルエラーになるのでmoveしてると思いますが、moveコンストラクタを自前で作ってprintfしてても何も出力されないのはどうゆうことですか?
930デフォルトの名無しさん
2021/08/03(火) 00:45:04.37ID:WMUswgP6
それは近年話題沸騰中のNRVO・ムーヴ省略でございます
931デフォルトの名無しさん
2021/08/03(火) 00:47:12.42ID:9z5WCbe9
move constructorをdeleteすると自動的にcopy constructorも
deleteされるからコンパイルエラーになるのでは
932デフォルトの名無しさん
2021/08/03(火) 07:24:04.62ID:wbx4PwZT
>>922
SHA1とは言ったが脆弱性とは言ってない
まんまと思う壺にハマって地団駄踏んでももう遅いんだよw
933デフォルトの名無しさん
2021/08/03(火) 08:13:23.67ID:51l84/HQ
>>932
コテハン付けろよ。
934デフォルトの名無しさん
2021/08/03(火) 08:19:20.45ID:wbx4PwZT
やだね
匿名掲示板をらしく使うのさ
935デフォルトの名無しさん
2021/08/03(火) 08:21:29.28ID:oNdzKEkg
お、おう
936デフォルトの名無しさん
2021/08/03(火) 11:04:05.90ID:VqTXxKXQ
>>930
ムーヴ省略ではないでしょ
937デフォルトの名無しさん
2021/08/03(火) 11:10:04.38ID:WMUswgP6
>>936
寝ぼけてましたすんません
>>937が正しいですね
938デフォルトの名無しさん
2021/08/03(火) 11:10:55.96ID:WMUswgP6
>>937>>931
もうだめだ
939デフォルトの名無しさん
2021/08/03(火) 12:43:15.32ID:oNdzKEkg
>>938
オキロ
940デフォルトの名無しさん
2021/08/03(火) 13:37:49.45ID:gDGs5ymT
>>931
初めて知りました。ありがとうございます
その線で試してみます
941デフォルトの名無しさん
2021/08/03(火) 22:48:49.67ID:OOW3UK0A
>>929 の者です
何もしてないときはNRVO、
move constructorをdeleteしたときはcopy constructorが暗黙定義されずコンパイルエラー、
move constructorを自分で書いたときはcopy constructorが暗黙定義され呼ばれる
となっていたようです
NRVOという機能があることも知らず勉強になりました
ありがとうございました
942デフォルトの名無しさん
2021/08/03(火) 23:08:06.61ID:OOW3UK0A
>>941
すみません、もう一回ちゃんと見てみたらcopy constructorは全く関係なかったです
move constructorがあればRVO/NRVOが働き、deleteすれば削除された関数を参照しようとしていますとなってコンパイルエラーでした
943デフォルトの名無しさん
2021/08/06(金) 00:25:17.82ID:+cdzf+J+
begin と end ってどう実装すりゃ良いのか分からんのだが
イテレータの方で「beginイテレータ」と「endイテレータ」みたいなものを実装しておいて begin と end はそれを呼ぶだけにするのってアリ?

あるいは、イテレータの初期値が begin 相当の場所を指すようにしておいて、イテレータの方で + 演算子を実装しておいて、
begin は初期化されたイテレータを、end は初期化されたイテレータ+Nを返すようにするもの?
ただし N はそのクラスのサイズみたいなものとする
944デフォルトの名無しさん
2021/08/06(金) 03:50:58.62ID:ZVqKoTKv
>>943 具体的な懸念が無いなら好きに試してみろとしか言えないかな。
945デフォルトの名無しさん
2021/08/06(金) 07:46:08.96ID:QuhZpDl4
>>943
特に詳しく無いんだけど(レベル低い話してたらごめんなさい)。

自分書いた時は、自分でこさえたコンテナクラス内にclass my_iterator を定義して、
必要な typedef (difference_typeなど)を行って(これやらんとアルゴリズムによっ
てはあれが無いとか文句言いよる)、あとは、いくつかの演算子を定義した。
イテレータの演算子は * ++ != あたりは定義したかな?足りなかったら追加の方向。

begin() end() は、my_iterator構築時にをポインタやインデックスなどの情報食わ
せて、そのオブジェクトを返す。
auto p = myobj.begin(), e = myobj.end();
while(p != e) { *p = ...; ++p; }

const に対応したり、後ろから反対向きにすすむ iterator とか、個別に定義して
いくとなんかかったるい。頑張って定義しても1回しかつかってねーよ的な。

自分は組み込みで書くことが多いんで、移植性の問題で標準ライブラリの利用も
ごく限定的なんで、劣化再発明でなんとかしないといけないことが多いから、
たまに必要になるんだけど。
946デフォルトの名無しさん
2021/08/06(金) 08:00:58.65ID:QgUKHcUo
逆進反復子はstd::reverse_iteratorで合成できるやん
947デフォルトの名無しさん
2021/08/06(金) 11:23:00.02ID:ejThTeu5
演算子や反復子のオーバーロードはその性質上、オーバーロード箇所を見つけにくくなる副作用が大きくて使うの避けてるわ
ラムダ式は、たとえメモ帳で開いた場合でも視認性は落ちないからこの種の副作用はない
948デフォルトの名無しさん
2021/08/06(金) 11:28:33.23ID:QgUKHcUo
反復子は仮引数を持たないから多重定義できない
949デフォルトの名無しさん
2021/08/06(金) 12:40:53.32ID:K8ga5O1Z
>>945
レベル低いっつーか聞かれてもない当たり前のことを長く言っている
950デフォルトの名無しさん
2021/08/06(金) 13:39:39.31ID:ACcOU+tV
operator* != ++(前置)を持ってるオレオレイテレータとそれを返すbegin()とend()が揃ってれば
拡張for文で使えるから大抵はそれで十分
951デフォルトの名無しさん
2021/08/06(金) 13:45:20.78ID:61Kw3Trn
iterator_traitsも使わんのか
最近の小わっぱどもわ
952はちみつ餃子 ◆8X2XSCHEME
2021/08/06(金) 14:06:55.11ID:hvfblY74
イテレータのカテゴリ (ランダムアクセス、双方向、片方向) によるが、
イテレータとして求められる要件は (C++11 だと) 24.2 にまとめられている。
https://timsong-cpp.github.io/cppwp/n3337/iterator.requirements

requirements はあくまでも標準においてはこういう前提を置いているという話なんで、
標準ライブラリとの組み合わせを考えなくていいなら厳密に従う必要はない。
組み込み系とかではどうせ標準ライブラリのフルセットなんか提供されないってことも多いだろうし。
953デフォルトの名無しさん
2021/08/06(金) 14:25:41.28ID:UG3EYJ5j
>>943
上のやり方と下のやり方でどっちが良いか決めるなら、当然下のやり方だろう
954デフォルトの名無しさん
2021/08/06(金) 15:02:59.98ID:UG3EYJ5j
>>943,953
補足
前者はそもそも意味がよーわからん
955デフォルトの名無しさん
2021/08/06(金) 20:55:48.69ID:51YKCZf/
だれかSOLID原則わかりやすく教えて
956デフォルトの名無しさん
2021/08/06(金) 21:09:37.01ID:2iK9+WXa
Dは重要
957デフォルトの名無しさん
2021/08/06(金) 21:15:50.18ID:51YKCZf/
依存性逆転…
メンヘラに逆に依存しろってこと?
958デフォルトの名無しさん
2021/08/07(土) 21:57:40.18ID:fhvRgHLH
OSAL(Operating system abstraction layer)について教えてくだちい
正しいAPI仕様はどこ見たら良いの?
ぶっちゃけスレッドの生成とJOIN、クリティカルセクション、イベント通知手段、セマフォ、遅延(Sleep)
が使えれば良いぐらいのミニマルな要求なので自力実装しても良いが方言を増やしても仕方が無いし、
959デフォルトの名無しさん
2021/08/07(土) 22:19:39.31ID:htSYk34i
std::threadつかうかpthread使えば。
960デフォルトの名無しさん
2021/08/07(土) 22:28:21.15ID:P3NgS3ss
これじゃないの?知らんけど
https://github.com/nasa/cFS/blob/gh-pages/OSAL_Users_Guide.pdf
961デフォルトの名無しさん
2021/08/07(土) 22:38:16.24ID:dRA6eDJQ
お猿って読むのかな?
962デフォルトの名無しさん
2021/08/07(土) 23:51:20.36ID:fhvRgHLH
>pthread
質問しておいてアレですが確かにOSの抽象化はPOSIXじゃいかんのか、とは思いました
ただpthread関連は使いにくいすぐる……
Win32APIでpthreadの互換品を作る事態になったら何のために生きているのかわからなくなりそう……
963デフォルトの名無しさん
2021/08/07(土) 23:59:07.20ID:tg14s6ns
使いにくいって
学習しろよバカが
964デフォルトの名無しさん
2021/08/08(日) 03:38:56.69ID:o6Sz00kX
RTOS向けのAPIらしいねOSAL
そういう用途で重要な要件を満たせるような仕様になってるのだろう知らんけど
965デフォルトの名無しさん
2021/08/08(日) 05:12:10.85ID:b7/SG9Fy
どちらかというとコードの動きが詠めずにコンパイルエラーに頼りまくるバカの方が大問題な気がする
966デフォルトの名無しさん
2021/08/08(日) 09:36:28.23ID:FX9juWvg
コードの動きを、詠む
風流だな
967デフォルトの名無しさん
2021/08/08(日) 09:54:35.44ID:X9nZYb13
std::threadを使わない理由を説明してもらわんとアドバイスのしようがないね
968デフォルトの名無しさん
2021/08/08(日) 11:10:29.77ID:p8p3x866
コードはアートだぞ?
969デフォルトの名無しさん
2021/08/08(日) 11:17:36.30ID:qvupnXSA
コードアートオンライン
970デフォルトの名無しさん
2021/08/08(日) 13:32:41.01ID:GYDyEW6S
プラットフォームごとにスレッド関数がまちまちなことは大した問題じゃないんだが、スレッド同期を考えればstd名前空間のクラスを使うのが今後の最適解になるでしょ
971デフォルトの名無しさん
2021/08/08(日) 14:23:53.13ID:tnUFWQWl
コンパイラや標準ライブラリの製作者よりも俺の方が詳しいと確信できる時以外は素直にstdに甘えるべき
972デフォルトの名無しさん
2021/08/08(日) 15:36:10.77ID:Hwfa9w/d
int a[3] = {1, 2, 3};
for(auto&& b : a) { std::cout << b; }

この範囲for文の「&&」って何者なの?
参照?
autoもautoで、autoはC++11で廃止になったって聞いてたんだけど・・・
973はちみつ餃子 ◆8X2XSCHEME
2021/08/08(日) 15:50:15.52ID:3b5W4SC5
>>972
auto は C から引き継いで C++ にも以前からあったキーワードだけれど、
誰も使ってなかったから元の意味を廃止してあらたな意味で使われるようになった。
廃止されたのは auto の以前の使い方であってキーワード自体は廃止されてない。
974デフォルトの名無しさん
2021/08/08(日) 16:04:41.80ID:b7/SG9Fy
値の参照値変数を伴ない値参照とでもいうべきか
975デフォルトの名無しさん
2021/08/08(日) 16:06:14.93ID:tnUFWQWl
釣りじゃないなら、とりあえず右辺値参照でググって一通り読んでこい
ここで全部説明してると長すぎる
976デフォルトの名無しさん
2021/08/08(日) 16:07:11.93ID:b7/SG9Fy
forループとかココらへんはコンパイラの最適化によっては&参照とあんま変わらんよな
977デフォルトの名無しさん
2021/08/08(日) 16:15:05.55ID:o6Sz00kX
auto && に関しては右辺値参照とは限らないというのもまたややこしい
978はちみつ餃子 ◆8X2XSCHEME
2021/08/08(日) 16:16:14.37ID:3b5W4SC5
>>972
&& は普通は右辺値参照を意味するが、一部の状況では万能参照になる。
(言語仕様上は万能参照とは呼ばれないが通例としてそう呼ぶことが多い。)
初期化子によって左辺値参照か右辺値参照かを自動的に選択するので、
よく理解できてないなら範囲for文をつかうときは && にしておけと入門者に勧める解説はよく見る。
実際、その状況では auto& と書いても結果は変わらない。
979デフォルトの名無しさん
2021/08/08(日) 16:53:04.10ID:Hwfa9w/d
>>973
>>978
ありがとう・・・!
メモっとく
980はちみつ餃子 ◆8X2XSCHEME
2021/08/08(日) 17:22:47.83ID:3b5W4SC5
>>979
言葉の様子からは昔の C++ (C++03 以前) は使ってたのかな?
と推察するけど、 C++03 と C++11 の間では大きな飛躍があって、
その後も変更は色々あるのでちょっとしたことをいちいち質問するのは効率悪いと思う。

ドキュメントを網羅的にわかりやすく整理しているとてもありがたいサイトがいくつかあって
仕様改定がどういうものだったのかもまとまっているので参考にするといいよ。

https://cpprefjp.github.io/lang/cpp11.html
https://ja.cppreference.com/w/cpp/11
981デフォルトの名無しさん
2021/08/08(日) 19:31:37.38ID:R0ImpkBa
std::threadってなぜかスレッドが実行中かどうかを調べるだけの関数がないんだよね
絶対にあった方が良いと思うんだけどなんか理由があるのかな
982デフォルトの名無しさん
2021/08/08(日) 19:40:44.42ID:Cdmlpdjr
joinableだけじゃ足りん?
983デフォルトの名無しさん
2021/08/08(日) 19:45:39.50ID:8fWNQyKy
pthreadsにそういうAPIが無いからなぁ
984デフォルトの名無しさん
2021/08/08(日) 19:55:15.31ID:GYDyEW6S
pthread_timedjoin_np()使えばいいじゃない
985デフォルトの名無しさん
2021/08/08(日) 20:02:19.74ID:8fWNQyKy
none portableじゃないですかやーだー (でも使う)

標準としては難しそう
986蟻人間 ◆T6xkBnTXz7B0
2021/08/08(日) 20:27:26.52ID:7BKdY7dG
native handleをgetしてWaitForSingleObject使うとか
987デフォルトの名無しさん
2021/08/08(日) 20:52:17.07ID:GYDyEW6S
>>985
nandemo portable の略だから大丈夫
988デフォルトの名無しさん
2021/08/08(日) 21:39:14.34ID:yBkpHZYz
普通にミューテックスで排他して状態管理せよ……
だいたいスレッドが動いているかどうかという1 bitだけを外部が欲しがるという用途は(join操作そのものを除き)あんま無く、
キュー的なブツに対するデータの排他的な出し入れが普通伴うはず……
989デフォルトの名無しさん
2021/08/08(日) 21:44:02.93ID:yBkpHZYz
ミューテックスで数千クロックサイクル浪費するのが嫌という向きは知らん
スピンロックとかdouble-checking lockみたいな対策になるかと思うが絶対安全かつポータブルな
方法というものは無くなる希ガス
990デフォルトの名無しさん
2021/08/08(日) 22:18:09.18ID:GYDyEW6S
>>988
速度重視でmap/unordered_mapでコンテナ作ってみたけどやっぱり仕様変更に耐えられるvector/listコンテナ最強的なオチに似たものある
991デフォルトの名無しさん
2021/08/08(日) 22:43:58.32ID:8fWNQyKy
キューへの投入と取り出しがそれぞれ1スレッドだけならミューテックスを使わなくてもアトミック変数だけで排他出来る(OSに仲裁してもらわなくていい)
992デフォルトの名無しさん
2021/08/08(日) 23:27:24.23ID:yBkpHZYz
OSの助けなしにどうやって待ち(と起床)を実現するつもりなんじゃ……
993デフォルトの名無しさん
2021/08/08(日) 23:43:25.11ID:2XV4yDHI
スレッドが実行中か確認したいってどんなときなのかな?
確認したところで次の瞬間には終了してる可能性あるわけじゃん
終了を待機したいならjoinすればいいし実行中をなんのために確認したいのかよくわからん
994デフォルトの名無しさん
2021/08/09(月) 00:16:27.81ID:bkD+cive
Linuxのpthread_mutexの実装で使われているfutexも競合しないタイミングならユーザランドだけで処理が完結する (OSが仲裁する必要があるのは競合する場合だけ)

> Futex operation occurs entirely in user space for the
> noncontended case. The kernel is involved only to arbitrate the
> contended case. As any sane design will strive for
> noncontention, futexes are also optimized for this situation.
>
> https://man7.org/linux/man-pages/man7/futex.7.html

キューが固定長, 投入スレッド1つ, 取り出しスレッド1つという条件でならアトミック変数2つ(読み出し位置, 書き込み位置)で「競合しない」ように出来るので, OSの仲裁が必要じゃなくなる
995デフォルトの名無しさん
2021/08/09(月) 00:22:59.44ID:bkD+cive
あと(pthread_mutexのようなネイティブの)mutexはそういう理由で大抵の場合は最速のロック機構になっているので, 自分で作るなら普通にmutex使った方がいいというのは同意
素人(俺とか)の考えたロックフリーデータ構造とか大抵設計か実装かその両方でバグが入る
996デフォルトの名無しさん
2021/08/09(月) 07:54:40.07ID:eF2Q2UUf
>>989
mutexが遅くてイヤならatomicじゃね?
997デフォルトの名無しさん
2021/08/09(月) 09:47:15.53ID:TRAo/ccI
>スレッドが実行中か確認したいってどんなときなのかな?
排他制御付きのキューを自力実装するときまれによくある……
キューがあふれそうになったときpushする側(producer)を待たせる作りにした場合、
popする側(consumer)はデータをpop後、producerが待っていたらその待ちを解除、
待っていなかったら何もしないという判断が居るのでこのためのフラグ
(producer側にpushを継続する意思があるかどうか、またはpush待ち中かどうかを表すフラグ)が居る

producerよりconsumerがいつも速い見込みでキューがあふれない前提(キューが必要に応じていくらでも大きくなる)
だったりその他(待ち解除が条件変数ではなくキューイングされるイベントだったり)だと無くてもよいから
ぜってー必要か、というとビミョーだがあった方がすっきり効率的なコードとして書ける
998デフォルトの名無しさん
2021/08/09(月) 09:51:30.16ID:TRAo/ccI
>>996
インターロックドインクリメントはまれによく使う
インクリメントに性交したら排他的操作権を獲得できた証、
999デフォルトの名無しさん
2021/08/09(月) 09:55:16.95ID:TRAo/ccI
となるようにインクリメントするカウンタの意味を仕向ける
1000デフォルトの名無しさん
2021/08/09(月) 09:55:21.66ID:eF2Q2UUf
>>998
アンカーミスってねい?
ニューススポーツなんでも実況



lud20251009070807ca

ID:UJvm/t/Iのレス一覧:


28デフォルトの名無しさん
2021/05/20(木) 02:43:42.49ID:UJvm/t/I
>>27
moveコンストラクタは、変数定義を
TYPE x = y;
の形式で書いた場合に y が右辺値の場合に呼び出されるだけ。
move代入は、
x = y;
の形式で書いた場合に y が右辺値の場合に呼び出されるだけ。
後者の場合、xがmove後であるかどうかは関係ない。

変数xの中身をmove後のxへの書き込み、xの破棄、x.init()などとしての
再初期化が「保証される」というのは、保証されるようにSTLライブラリなどが
作られているという意味で、コンパイラが保証するというわけではない。
29デフォルトの名無しさん
2021/05/21(金) 05:29:55.67ID:J+Oc/LGb
T が値なら終了して、vector<T> なら再帰的に自分を呼ぶ関数を作りたいのですが、T が vector (あるいはコンテナ) かどうかで分岐する処理ってどうやって書くのが良いですか


あと近い話題で、+ 演算子をオーバーロードして vector + vector が結合された vector を返すようにするのってナシですかね?(string のように)
要素同士の和をとるのと紛らわしいですか?
cat(vector, vector) とかの方が良いかな
30デフォルトの名無しさん
2021/05/21(金) 06:16:08.57ID:682YZm8K
固定長文字列クラスってないんですかね

template<int N> void hoge(string s){
 ……
 assert(N == s.size());
 array<int, N> a;
 ……
}
なる関数を呼び出すときにテンプレートパラメータを省略したいんです
s が固定長なら s から N を推論してくれますよね
31デフォルトの名無しさん
2021/05/21(金) 06:29:04.74ID:682YZm8K
あるいは hoge の引数を costexpr に限る方法なんかがあれば、N は必ずコンパイル時に推論できるようになるの思うので、もしそういうものがあればそれでも大丈夫です
32デフォルトの名無しさん
2021/05/21(金) 11:15:57.88ID:pMLUvwAV
もしかして、C++11に対応したSTLで、BSD/MIT 系ライセンスのものは存在してませんか?
・apache-stlは、2008年くらいで開発が終了しているようです。
・msvc用のstlはapacheライセンスですが、vcruntime.hが存在しないと
 エラーになるようです。
33デフォルトの名無しさん
2021/05/21(金) 12:27:55.17ID:anlX8gXg
apacheで良ければllvm
34デフォルトの名無しさん
2021/05/21(金) 15:55:15.71ID:FMNTAZuF
>>30-31
これマジキボンヌなので何卒よろしくお願いします
35デフォルトの名無しさん
2021/05/21(金) 16:07:34.25ID:wQUXYA+s
>>30
よくわからんが何で長さの相違を型の相違にしたいんだ?

文字列リテラルならこういう手があるけど
template <int N> void hoge(const char(&s)[N])
{
}
36デフォルトの名無しさん
2021/05/21(金) 16:09:26.25ID:zwURlIka
>>34
整数のテンプレート引数を使って、std::stringを継承した文字列クラステンプレートを作ればなんとかなりそう。試してないけど。
std::stringの継承はけっこうクセがあった気がするから、自分で調べてね。
37デフォルトの名無しさん
2021/05/21(金) 16:18:16.28ID:cnTkitrU
>>30
>テンプレートパラメータを省略したいんです
の理由がただお遊びレベルのような気がしてスルーしてたけど
固定長の文字列クラスは標準には無い、欲しけりゃ探すか自分で作れ、それか>>35
38はちみつ餃子 ◆8X2XSCHEME
2021/05/21(金) 16:51:46.16ID:JT5uzYpW
コンパイル時プログラミングのための機能を満載したライブラリ Sprout がある。
constexpr 対応した文字列クラスもある。
http://boleros.hateblo.jp/entry/20110926/1318115291

ボレロ村上が亡くなってもう一年以上たったんだなぁ……。
Sprout のメンテナンスを引き継ぐ大きな組織とかないのかね?
いっそ Boost に編入するとかでもよいような気がするが。
39デフォルトの名無しさん
2021/05/22(土) 04:55:57.93ID:Dt9VIAZx
>>35
> 何で長さの相違を型の相違にしたいんだ?
すみません。どういう意味でしょうか
やりたいことは、関数に渡した定文字列の長さをコンパイル時定数として扱うことです


> 文字列リテラルならこういう手があるけど
ありがとうございます
これが現在やりたいことに最も近いです
2つの文字列リテラルの共通部分列の長さをコンパイル時定数として扱うみたいなこともできそうで、ワクワクしています


>>36-37
ありがとうございます
自作は想像だにしない失敗に繋がりそうなのでやめておきます


固定長文字列とか引数を constexpr に限るとかすごい便利な機能に思えるんですが、今後標準に入ることはあるんでしょうか
それとも僕の不理解で便利に見えるだけなんでしょうか
40デフォルトの名無しさん
2021/05/22(土) 10:24:05.95ID:zUe7A7la
固定長文字列ってCOBOL以外にあるの?
FORTRANにも無いしCにも無い
現行言語には存在すらしない
昔から特殊技術で需要が少ない
41デフォルトの名無しさん
2021/05/22(土) 10:31:31.29ID:tdkMyXe1
malloc使わなかったらcも固定長でしょ
あとsql
42デフォルトの名無しさん
2021/05/22(土) 12:24:13.54ID:oerUOwsX
>>39
文字列長ごとにメソッドが別になってプログラムサイズの肥大化に繋がる。

スタックに文字列を全部乗っけて(若干の)スピードアップを狙うこともあるけど、そのときでも「〇〇文字以下」みたいにサイズ制限するくらい。Delphiの文字列がそうだったと思う。
43デフォルトの名無しさん
2021/05/22(土) 14:32:38.17ID:uYvLH1Gz
>>40
FORTRANにもあるしPascalにもあるぞ
需要じゃなくてお前の知識が少ないだけだろw
44デフォルトの名無しさん
2021/05/22(土) 16:10:33.68ID:F6wYMINE
clangで、#includeや#include_nextした全てのインクルードファイルの
パスの一覧をテキストファイルに出力することは出来ますか?
45はちみつ餃子 ◆8X2XSCHEME
2021/05/22(土) 18:00:59.52ID:+NInCFK+
>>44
-MD オプションかな。 これは gcc と clang で共通。
46デフォルトの名無しさん
2021/05/23(日) 06:05:08.87ID:NALp7ema
すみません
>>5の方法で可変個の参照の組を関数に渡そうとして行き詰まりました

hoge の定義を
template<class T> void hoge(vector< reference_wrapper<T> >);
として、hoge({a, b, c}) と呼んだら T が推論できないとエラーが出ました
47デフォルトの名無しさん
2021/05/23(日) 07:05:25.07ID:apxwsDfF
a, b, c がfoo_t型だとして
単に型foo_tを明示して hoge<foo_t>({ a, b, c}) と呼んだら良いんジャネーノ;;;
48デフォルトの名無しさん
2021/05/23(日) 07:07:18.56ID:apxwsDfF
質問ですがvirtualでないクラスFoo(つまりdynamic_cast適用不能)のオブジェクトをthrowしたら
catchできます?
49デフォルトの名無しさん
2021/05/23(日) 07:30:24.57ID:NALp7ema
>>47
ありがとうございます
ただ、なぜに推論できないのでしょうか

template<class T> void hoge(vector< reference_wrapper<T> >);

template<class T> void hoge(vector<T>);
が両方あってどっちか判断できないって話なら分かるんですが
50デフォルトの名無しさん
2021/05/23(日) 07:33:59.12ID:8ydzk+Rl
reference_wrapper<T> をテンプレート型として認識できないからでしょ
51デフォルトの名無しさん
2021/05/23(日) 07:51:37.19ID:NALp7ema
>>50
ありがとうございます
コンテナの入れ子の中に T があっても推論してくれる例を知っていたので、いつでもできるのだと誤解していました
52デフォルトの名無しさん
2021/05/23(日) 08:00:14.50ID:apxwsDfF
{ 1, 2, 3 }というだけではstd::vector<int>なのかstd::vector<double>なのか(ひょっとしたらstd::vector<long>とかかも??)
わからないからという理由
自動型変換結果とのマッチングは追求しだすときりが無いので規格でどの範囲でやるか制限がかかっているたはず
53デフォルトの名無しさん
2021/05/23(日) 08:08:22.67ID:p04S1woO
>>48
C++はintだって投げられるし捕まえられるぞ
54デフォルトの名無しさん
2021/05/23(日) 08:15:35.83ID:apxwsDfF
>>53
投げたブツの型の情報がどうやってcatchする場所に伝わっているのかキボン
55デフォルトの名無しさん
2021/05/23(日) 08:18:02.28ID:W+jRvSTD
以心伝心
56デフォルトの名無しさん
2021/05/23(日) 08:30:19.77ID:GrP2Tvrl
Emacs で LSP 使わず開発してる人いる?
おもしろ設定とか参考になるサイトあったら教えてほしい

flycheck しか入れてない
57デフォルトの名無しさん
2021/05/23(日) 09:14:09.25ID:p04S1woO
>>54
関数呼び出しと一緒やぞ
catch節に書いた仮引数でオーバーロードしてると思えばいい
58デフォルトの名無しさん
2021/05/23(日) 09:31:01.96ID:apxwsDfF
>>57
ありえん
1つのthrowに対し、呼び出し元のcatchで呼び出すべき(オーバーロードされた)関数シンボルを一意に列挙できるなら
アンワインド時にオーバーロードのしくみで例外ハンドラの解決を行えるかもしれないが、これは論理的に成り立たない
なぜなら、例えばintを例外をスローする関数foo()がbar()とbaz()から呼ばれているとして、
bar()にcatch (int)が書かれているのにbaz()に描かれていないとした場合、
bar()経由の呼び出しにおいては(オーバーロードされた)関数シンボルのリストに func(int)が含まれるのに対し、
baz()経由の呼び出しにおいては(オーバーロードされた)関数シンボルのリストに func(int)が含まれない、
となって一意にならず、throwした瞬間にどっちなのか解決不能
やっぱcatch側が(何が来るかわからない状態で)待ち受けているとしか考えられない
59デフォルトの名無しさん
2021/05/23(日) 09:40:45.57ID:apxwsDfF
ちょっち補足すると、
bar()でtry { foo(); } catch (int ex) { .... } したときに handler(int)を例外ハンドラのリストに動的に登録し、
baz()ではtry { foo(); } catch (int ex) { .... } が無いからhandler(int)を例外ハンドラのリストに動的に登録しないようにすれば、
foo()でthrowしたときに最新の例外ハンドラのリストを参照することによって解決はギリ可能だが、
スタックとは別に例外ハンドラのリストに動的に管理するみたいなことをしているのかとカナーリ疑問に、
(例外がfall throughする関数の中にはゼロコストの奴も含まれるので、スタック上で細工して例外ハンドラのリストを更新管理することは不可能
60デフォルトの名無しさん
2021/05/23(日) 09:42:11.13ID:vhcqGTpc
>>54
exception_ptr
61デフォルトの名無しさん
2021/05/23(日) 09:52:50.26ID:apxwsDfF
exception_ptrの主な用途は、バックグランドスレッドからメインスレッドに、例外オブジェクトを持ち運ぶ、というものである。標準ライブラリにおいては、promiseとfutureの実装で使用される。
と書いてあってスレッド間をまたぐ用(promiseしたことを実行中に起きた例外を、promise完了を待っているやつに伝える)とき限定に見える

単純にcalleeからcaller側に飛ばす通常の例外ではどうなのや??

intやdoubleやconst char*を型情報とともに収容可能なexception_ptrみたいな構造体が絡んでいるのだろうとは思いまするが
62デフォルトの名無しさん
2021/05/23(日) 09:54:00.48ID:apxwsDfF
イマイチ確証が無い
63デフォルトの名無しさん
2021/05/23(日) 10:08:43.53ID:vhcqGTpc
>>61
スレッドは関係ないぞ
同一スレッドでも監視ブロックを抜けrた後でrethrow_exceptionできるし
64デフォルトの名無しさん
2021/05/23(日) 10:30:51.86ID:apxwsDfF
>>63
言わんとすることはわかりまするが
(そもそもpromise/futureのしくみも論理的には単なる継続なので単一スレッドでの実装もあり得るという意味でスレッドは関係無い
しかしrethrow_exception(ex)はrethrow_exception(ex)であってthrow exとは別の文やん??
本当に単純にcalleeからcaller側に飛ばす通常の例外も同じしくみなのかどうか、、、
65デフォルトの名無しさん
2021/05/23(日) 10:45:18.88ID:apxwsDfF
スマン>>58>>59は撤回
やっぱ関数のオーバーロードで呼び出すべきハンドラを解決している可能性がありえまつね
というのはスタックにはreturn addressが積まれているので、throw intするfoo()は、
throwする瞬間に自分がbar()経由で呼ばれたのかbaz()経由なのか判定可能
あとはreturn addressに対して呼び出すべきハンドラ(のシンボルのリスト)を与えるテーブルがあれば、
関数のオーバーロードで呼び出すべきハンドラを解決できる
極力実行コストを低くする手となるとこれかなあ……
長々とスマンカッタ、継続調査しまつ
66デフォルトの名無しさん
2021/05/23(日) 12:13:22.18ID:MJ9lD3tL
>>56
>Emacs で LSP 使わず開発

その発想がナンセンス
67デフォルトの名無しさん
2021/05/23(日) 13:43:41.87ID:p+CWzw6b
>>66
lsp-mode インストールしてファイル開いてみたら「これはなんのプロジェクトにも属してないファイルだ」とか言って何もしてくれなかったもん
テキストエディタだぞ
単一ファイルのソースも普通に編集できるべきだ
68デフォルトの名無しさん
2021/05/23(日) 13:53:03.07ID:P4UGjjTl
インストールさせるという選択肢である以上は
emacs側はそれをやるかどうかの選択をユーザに委ねていることになる
なのでNoという選択もありうる、とemacs側は考えている

選択肢が無く強制なら選択をさせずインストール現象もまた起こらない
インストールさせるということはYesかNoかをユーザが選ぶことができる仕組みになっているからだ
YesでもNoでもなく選択出来ないならインストールさせない仕組みになっているハズだ
ここでインストールできるということはユーザのYes/Noの意思が尊重されることに他ならない

選ぶ・選ばない・強制、などにおいて、選ぶことが出来る事象については何を選択してもいいし、emacs側もそれを容認している
69デフォルトの名無しさん
2021/05/23(日) 14:03:17.45ID:JOTdPSSV
>>45
有難う。
70デフォルトの名無しさん
2021/05/23(日) 14:27:22.85ID:vhcqGTpc
>>64
よくわからんが、こういうこと?
void caller()
{
exception_ptr ex;

ex = callee();

try
{
rethrow_exception(ex);
}
catch(double err)
{
cout << "What the hell does that mean?\n";
}
}

exception_ptr callee()
{
try
{
throw 0.1;
}
catch(...)
{
return current_exception();
}
}
71デフォルトの名無しさん
2021/05/26(水) 14:25:57.68ID:h0MuFhR9
クラスAがクラスBのインスタンスをメンバに持つとき (移譲っていうんだっけ?)、Bのコンストラクタってどーやって呼ぶんよ
72はちみつ餃子 ◆8X2XSCHEME
2021/05/26(水) 15:13:47.43ID:BWKw9sIj
>>71
メンバ初期化子リスト
https://ja.cppreference.com/w/cpp/language/initializer_list
73はちみつ餃子 ◆8X2XSCHEME
2021/05/26(水) 16:01:46.87ID:BWKw9sIj
C++20 からは std::string は constexpr 対応になっとるな。
実装が追いついとるかどうか知らんけど。
74デフォルトの名無しさん
2021/05/26(水) 17:48:11.97ID:ArjioGpg
vectorもconstexpr
75デフォルトの名無しさん
2021/05/27(木) 04:38:09.87ID:wOxUHlR5
constexpr引数ってコンセプトとか使っても無理なん
76デフォルトの名無しさん
2021/05/27(木) 10:11:42.93ID:KxmxhHMB
なぁ…何気に…普通に…何の気なしに…以下の様なコードを書く…
textView1->get_source_buffer()->place_cursor(
textView1->get_source_buffer()->get_iter_at_line(minusList.front() - 1));
なんだけどさ…このplace_cursorの引数はiteratorなんだが…この一時的に作った無名の変数の寿命って…
どうなってるの?…ちなみに…place_cursorは&で受ける…やばいのかな?
77デフォルトの名無しさん
2021/05/27(木) 10:35:07.24ID:KxmxhHMB
place_cursorを実行している段階では…生きている…そうだ…次のステップに移行すると…消える…らしい
ほんまかいなと思いますが…一応…信じておきます…
78デフォルトの名無しさん
2021/05/27(木) 11:20:16.69ID:tgaRcrWk
またお前か
79はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 13:24:29.13ID:tXzwBfxM
>>76
一時的なオブジェクトの寿命が完全式の終わりであることは保証されている。
https://timsong-cpp.github.io/cppwp/n3337/class.temporary#3

参照が一時オブジェクトに束縛されているときは更に寿命が延長されることもある。
80デフォルトの名無しさん
2021/05/27(木) 14:31:37.41ID:U0nLnJgd
勝手に消えるのは確かだが
いつ消えるかは確定出来ないんじゃないの?
次の行の実行中かも知れないし
もう少し生きてるかも知れない
関数抜けたら消えるだろうけど
81デフォルトの名無しさん
2021/05/27(木) 14:35:50.64ID:P6misAvy
その、意味があるとかないとかを、どうやって判断するかと聞いてるんじゃないかね
82デフォルトの名無しさん
2021/05/27(木) 14:57:58.21ID:THQ6jHMK
記述時に事細かに寿命を制御・確定できるような時制プログラミングを作ればいい
C++の場合だと新しい原理を作ればいい
83デフォルトの名無しさん
2021/05/27(木) 15:03:35.45ID:kQVwJQto
> 参照が一時オブジェクトに束縛されている

一時オブジェクトが参照に束縛されている、だろ
ここではconstでない左辺値参照は含まない
84はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 15:10:56.23ID:tXzwBfxM
>>83
> 一時オブジェクトが参照に束縛されている、だろ

いいえ。 束縛されるのは参照で束縛するのはオブジェクトです。
85デフォルトの名無しさん
2021/05/27(木) 15:24:54.29ID:kQVwJQto
>>84
規格票での言葉遣いはこうなっているぞ
CA &&r = A{}; // OK, reference binds to temporary array object
86はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 15:27:03.62ID:tXzwBfxM
>>85
実際はそこらへんいいかげんなんですよ。
87デフォルトの名無しさん
2021/05/27(木) 15:30:34.22ID:kQVwJQto
いや、おかしいだろ
rand(); //ここで消えてしまう一時オブジェクトを
auto&& a = rand(); //引き止める(束縛する主体が参照で
客体が一時オブジェクトだぞ
88デフォルトの名無しさん
2021/05/27(木) 15:31:06.17ID:kQVwJQto
typo
(束縛する)
89はちみつ餃子 ◆8X2XSCHEME
2021/05/27(木) 15:46:15.37ID:tXzwBfxM
>>85
このへんのセクション内部ではどちらの表現もある。
https://timsong-cpp.github.io/cppwp/n3337/over.ics.ref

"自由変数と束縛変数"
https://ja.wikipedia.org/wiki/%E8%87%AA%E7%94%B1%E5%A4%89%E6%95%B0%E3%81%A8%E6%9D%9F%E7%B8%9B%E5%A4%89%E6%95%B0

このへんの数学的用語では束縛されているのは変数で、 ML 系とか Scheme とかでも一貫してこの用法に従ってるんだけど、
めんどいから私は「××との間に束縛を持つ」みたいな言い回しでどちらが主語なのか曖昧にしたりしてる。

今回の場合は >>79 で示した通りオブジェクトの寿命に関する項目での表現では束縛されているのは参照だから
それにならっただけでどっちがどっちでもまあ重要じゃないよ。
90デフォルトの名無しさん
2021/05/27(木) 16:09:02.89ID:kQVwJQto
>>89
1つめのリンクでは
結合する主体は参照を宣言するコンテキストだね
結合される客体がオブジェクトである点は変わってない

数学や他言語がどうたらには付き合ってやんね

ちゃんとC++の話のなかで例えるなら
実体定義と外部宣言はどちらが使われる側と使う側なのか
のような話だろ
91デフォルトの名無しさん
2021/05/28(金) 04:05:49.41ID:cE/PGHSY
そことは直接関係ないけど、cppreferenceの英語版って、英語として文法的におかしい
ことが有る気がする。主語が無くていきなり三人称単数現在のsが付いた動詞で
始まっている文章も、見出しの直後ならダメではないが、見出しの直後以外の
if節の後にあったりして、しかもそれがif節の中に繋がっていなくて、本来なら
主語を省略できない場合とか。
Microsoftの英語版はすらすら読めるけどcppreferenceの英語版は読めない。
92デフォルトの名無しさん
2021/05/28(金) 04:22:43.88ID:bFqxphgp
int 配列の参照って
int (&a)[N]
であって
(int&) a[N]
じゃないよね?
後者は「参照の配列」を意味するようで変なのは分かるんだが、前者は前者でどこに&ついてんねんって感じなんだが
93デフォルトの名無しさん
2021/05/28(金) 04:30:30.62ID:O9o6B/0s
>>91
てにをはがおかしいのは日本国憲法に比べればかなりマシ。がまんしろ
94デフォルトの名無しさん
2021/05/28(金) 04:57:54.48ID:0J3ydS6A
>>92
>int (&a)[N]
それは、数学記号の様に読み取ることが出来る。
()は優先順位を変えているだけ。
優先順位に従って書いてみると、
a --> & --> [N] --> int
となる。これにより、
「a は、参照で、それは、[N] を指し、その要素は int である」
と読めて、もう少し自然な言語に直すと
「a は、参照で、それは、N要素の配列を指し、その配列の要素は int である」
となり、さらにわかり易くすると、
「a は、要素が int の配列を指している参照である」
となる。このように数学の式変形の様な工程を経ているだけの、単なる計算の様な
ものに過ぎない。
95デフォルトの名無しさん
2021/05/28(金) 05:01:18.55ID:0J3ydS6A
>>94
[補足]
a --> & --> [N] --> int
を英語で読んでみると、
「a is & to [N] to int」
となる。& を「reference」、[N]を「N要素のarray」に置き換えてみると、
「a is reference to "N要素の配列" to int」
となる。日本語に直せば、
「aは、int 型の N要素の配列への参照」
となる。
96デフォルトの名無しさん
2021/05/28(金) 05:51:02.47ID:bFqxphgp
それはたとえば
int (a&)[N]
などを禁止する理由になってるだろうか
97デフォルトの名無しさん
2021/05/28(金) 06:18:19.72ID:fuFcwWPl
参照修飾子はすぐ右にある対象を修飾する
98デフォルトの名無しさん
2021/05/28(金) 06:24:24.88ID:Q2cy611+
>>39
> 2つの文字列リテラルの共通部分列の長さをコンパイル時定数として扱う
をやろうとして苦戦しています
再帰 constexpr 関数で計算しようと思ったんですが、引数として受け取った文字列リテラルの要素って定数と見なせないですよね?

そもそも無理か、勉強次第でできるかだけでも教えていただけたらありがたいです
99デフォルトの名無しさん
2021/05/28(金) 12:14:40.97ID:sAi5WsuI
>>96
(a&)
の部分は、()は優先順位を変えているだけなので、コンパイラは
a&
という部分式を認識しようとする。しかし、a& という部分式は
C++では文法的に存在して無いのでエラーとなる。
単にそれだけの事。
100デフォルトの名無しさん
2021/05/28(金) 12:22:24.96ID:sAi5WsuI
>>99
[補足]
C++コンパイラが
int x[N];      // (1)
というテキストをパースする際、コンパイラ内部では、
x --> [N] --> int
という順序の演算が並んでいると理解されている。そして、
int (&a)[N]     // (2)
というテキストをパースする時、優先順位括弧があるために、
(1)において、x を &a に置き換えたようにコンパイラは理解するなので、
数学の式変形での「代入」のように考えて、
&a --> [N] --> int   // (3)
のようになる。そしてさらに、&a は、a --> & のように式変形されるので、
(3) に安全のために優先順位の()を付けてそれを「代入」すると、
(a --> &) --> [N] --> int   // (4)
となる。しかし、この場合、優先順位の括弧ははずせるので、
a --> & --> [N] --> int   // (5)
となる。ここで、もとのテキストが、
int (a&)[N]     // (6)
だったならば、x が a& に相当することになるが、a& という部分式はC++には
存在しないので、そこでエラーになる。

レス:1-200 201-400 401-600 601-800 801-1000 ALL

このスレへの固定リンク: http://5chb.net/r/tech/1621389313/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「C++相談室 part156 YouTube動画>1本 ->画像>1枚 」を見た人も見ています:
C++Builder相談室 Part21
C++相談室 part157
C++相談室 part153
C++相談室 part136
C++相談室 part149
C++相談室 part117
C++相談室 part137
C++相談室 part132
★★★ゲイの生活相談室3★★★
C♯相談室 Part20
エイブル相談室
おっさん人生相談室
ほのぼの相談室
男こども電話相談室
ほのぼの相談室
相談室
アクア相談室(′д)
不登校相談室8
今日子の悩み相談室
ハゲミン相談室
ARMY相談室
全国男電話相談室
KDDIお客様相談室
パワハラ相談室
必ず誰かが相談に乗ってくれる恋愛相談室Part623
NIPお悩み相談室
夏休み男相談室
荒らし相談室
IT何でも相談室
丸のベース相談室
八百長お悩み相談室
夏休みVIP相談室
40代の悩み相談室
NIPお悩み相談室
相談所別室避難所
16mm映画制作相談室
お悩み相談室
削除人相談室6号室
進路相談室スレ
アンコン相談室
Diners Club /// ダイナースクラブ 会員談話室 129
ゲイの法律相談所
相談乗って…
エアコン修理相談 2
相談です…
ハムスターの病気や怪我の治療について相談 5
2chの独り言相談場
本気の恋愛相談
ゲイの悩み相談スレ
Excel総合相談所 143
嫁浮気された相談
ガイジの相談スレ
Excel総合相談所 89
ナンパの本気相談
Excel総合相談所 141
ホモ増田の人生相談
登山靴購入相談スレ
メイ「書き方相談」
Excel総合相談所 139
Excel総合相談所 148
【初心者】キリスト教@談話室757【歓迎♪】
【初心者】キリスト教@猥談室 10 【歓迎】
【初心者】キリスト教@談話室731【歓迎♪】
相談です
人生相談
相談乗ってくれ
02:41:17 up 4 days, 11:47, 0 users, load average: 19.09, 27.16, 32.72

in 0.044765949249268 sec @0.044765949249268@0.1 on 100915