C++相談室 part162

■ このスレッドは過去ログ倉庫に格納されています
1sage (ワッチョイ fbf0-ofdD)
垢版 |
2022/10/31(月) 14:29:35.57ID:J5sgTSch0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part161
https://mevius.5ch.net/test/read.cgi/tech/1653135809/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/12/15(木) 07:27:41.09ID:dbf8SNdVd
でかい声出しても人を小馬鹿にしても
それでハッシュでないものがハッシュになるわけでなし
無駄で関係ない努力をし、そのために他人に迷惑が及んでも
構わないという自己中心的なやつ
2022/12/15(木) 07:31:15.67ID:hWaEpCH1a
>>768
一人二(+a)役でピンポンしてるだけでは
2022/12/15(木) 07:50:47.01ID:YuqRQs180
>>745でわからないアホと会話するのは不可能
2022/12/15(木) 07:52:47.62ID:0irp5Zs10
>>778
あまりにも、あまりにもレベルが低い
まるでチンパンジーのようだ
2022/12/15(木) 12:23:36.75ID:WaHslr7gM
>>784
>>778

>745で説明したことにするアホと会話するのは不可能
2022/12/15(木) 12:47:10.10ID:WaHslr7gM
hashのレスはあんまり読んでいないんだけど、c++標準のhashの話だよね?

c++標準と関係の無いhashをc++スレで持ち出してhash hash 言っているわけじゃないよね?

まさかそんなアホいないよね?
2022/12/15(木) 13:55:56.86ID:adPtbWG70
いまだにハッシュガーとか言ってるのは何が悔しいのか粘着キチだからスルーでOk
2022/12/15(木) 16:19:30.66ID:dbf8SNdVd
>>787
いやC++に限らない一般論としてハッシュとは何が明らかに分かってないやつが暴れてんの
2022/12/15(木) 16:24:26.31ID:dbf8SNdVd
見たところPerlスレ民のほうが
キチガイを追い出すのはうまかったようだな
791デフォルトの名無しさん (ワッチョイ a701-u86g)
垢版 |
2022/12/15(木) 19:54:56.58ID:SaYQ/lLy0
Perl民は70代中心だからな。
2022/12/16(金) 00:24:44.89ID:kaubkXoa0
心の欲するところに従えども矩を踰えず、
2022/12/16(金) 08:43:50.12ID:Sk8Nrr7L0
名前、それ自体がハッシュだよ
ありとあらゆるものが名前を与えられることによって唯一性・独自性を確保する
つまり、人間の脳は万物をハッシュで管理している
2022/12/16(金) 08:57:47.68ID:3/NVi56ad
ほらな
何にもわかっちゃいねえ
乱数や暗号との違いが言えねえぞコイツ
2022/12/16(金) 09:10:39.36ID:wsa7u1K/d
C++の話しようぜ
2022/12/16(金) 10:09:11.46ID:zTEnSqew0
c++20のコンセプトとかモジュールとか<=>とか誰か使ってる?
2022/12/16(金) 10:24:14.76ID:8MYQQby5d
<=> 使ってる
2022/12/16(金) 11:19:29.52ID:rgyul2GY0
>>796,797
へー 初めて知った
2022/12/16(金) 12:00:08.46ID:8wSlC2cWa
ウホッ演算子
2022/12/16(金) 12:09:30.80ID:3/NVi56ad
<=>は便利だね
使い出すとやめられん
801デフォルトの名無しさん (ワッチョイ 675f-k8RX)
垢版 |
2022/12/16(金) 12:26:19.15ID:YwJTJAAR0
<=>初めて知ったけどめちゃ便利だな
うちの環境じゃ使えないのが残念だけど
802デフォルトの名無しさん (スプッッ Sd7f-GCrc)
垢版 |
2022/12/16(金) 15:18:01.45ID:h3Zax2und
operator==のdefaultは便利だわ
2022/12/17(土) 02:36:30.45ID:ufrS8am+a
a > b, a < b, a == b を一度に判定するだけの演算子の何がそんな便利やねん!
とおもったらこれ一つ定義するだけで各種比較演算子全部児童生成してくれるのね
なるほどこりゃ便利かも
2022/12/17(土) 05:21:21.32ID:dncno9m70
unorderedの比較の実装は相変わらず迷う
2022/12/17(土) 08:51:24.48ID:SViislQC0
ロリコンショタ歓喜じゃん
2022/12/17(土) 09:11:20.17ID:rODQUlPF0
using rel_ops だとスコープ全体に影響でるから使用控えてたけど、operator<=>で全部解決出来るようになったのはいいな
2022/12/17(土) 09:32:05.93ID:XBBLmCjVd
3方があると4方も欲しくなる

a < b
a = b
a > b
unordered

結局戻り値4値の関数を作ることになる
2022/12/17(土) 11:46:18.72ID:QZoKK6jA0
宇宙船演算子……!
ってオーバーロード……!
可能なの……?!
2022/12/17(土) 12:25:08.76ID:dQNfWhWG0
>>807
std::partial_ordering返すようにすれば<=>で4方出来るぞ
2022/12/17(土) 12:44:09.97ID:rODQUlPF0
>>808
いや、なにをいってるんだ
そのためのものだろ
2022/12/17(土) 14:06:58.32ID:t4TbQFP40
ストリーム入出力に使っていけ(※冗談です)
2022/12/17(土) 14:23:32.76ID:QZoKK6jA0
>>810
それはそうか……orz
a-bのオーバーフロー対策なだけかと一瞬思った……
2022/12/20(火) 07:42:37.51ID:louNKIVjd
NaN同士の比較とかあるからな
2022/12/20(火) 14:22:24.61ID:UPRI61by0
このスレ見てるとわかるがC++が好きって言ってるやつって知能低いな
2022/12/20(火) 15:05:44.24ID:0942ga5D0
このスレには周囲に天才と言われる人がいるからそれは違うな
816デフォルトの名無しさん (ササクッテロロ Spb3-7wYa)
垢版 |
2022/12/20(火) 15:17:57.65ID:/qMRbodsp
自称だけどな
2022/12/20(火) 15:21:56.61ID:louNKIVjd
あんなやつに褒められても嬉しかねえよってやつに
どう思われようが関係ねーなあ
2022/12/25(日) 18:29:48.93ID:Dw6urQXv0
namespace std {
template <class T, std::size_t N>
struct array;
}

みたいに標準ライブラリの前方宣言を自作のヘッダに書くのってやっぱり未定義動作なんですかね?
2022/12/25(日) 18:51:26.23ID:PNih05NQ0
stdに勝手に宣言加えていいのは既存テンプレートの特殊化だけ
他は未定義
2022/12/25(日) 20:29:17.71ID:8blj/qJt0
>>818
原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
https://timsong-cpp.github.io/cppwp/n4861/namespace.std
その事例も該当すると思う。

条件付きで許されている特殊化はあるが C++20 から制限が強化された。
(従来は条件付きで「テンプレートの特殊化を追加できる」だったのが「クラステンプレートの特殊化を追加できる」に改められている。)
ユーザー定義型ごとのカスタマイズを許したい場面では Customization Point Object (CPO) を
活用する方向性なので特殊化でどうにかする必要もないし制限が強くなることはあっても緩和されることはないんじゃないかな。
2022/12/25(日) 21:15:27.65ID:BoLdymVdF
そんな堅苦しい事なんて言わんでもええやん?
どんな弊害があるん?
2022/12/25(日) 22:24:02.06ID:9/OfwQI/0
>>821 標準ライブラリの変更にあたって、 std に宣言追加しているソースへの影響を考えないといけなくなる。
2022/12/25(日) 22:39:45.88ID:8rnFU1jp0
>>822
リンクで失敗するので修正すれば良いだけでは?
2022/12/25(日) 22:40:44.04ID:8rnFU1jp0
「未定義」ってほどには深刻な問題はないと思うんだよね
2022/12/25(日) 23:02:22.44ID:PNih05NQ0
コンパイラがstdに勝手宣言がないことを前提にしたあらゆる最適化の結果を受け入れるなら別にいいと思うよ
俺は絶対に嫌だから関わらないでくれよ
826デフォルトの名無しさん (ワッチョイ b101-jXNG)
垢版 |
2022/12/25(日) 23:15:00.75ID:8rnFU1jp0
>>825
いやまぁ>>818は俺じゃないので俺も必要性を感じているわけではないけども
具体的に何を恐れているのか分からん
2022/12/26(月) 01:10:32.66ID:OBkbHJZM0
>>826
何が起きるか具体的にわからないから恐ろしいんだよ。
828デフォルトの名無しさん (ワッチョイ 8d01-s0Sd)
垢版 |
2022/12/26(月) 01:18:22.88ID:D/1vl6x80
>>827
ワクワクしてこないか?
2022/12/26(月) 01:20:46.52ID:YnLWxzzl0
>>827
oresamaライブラリの中でoresama名前空間があって
arrayが定義されていたとして
oresamaライブラリとは別のプロジェクトで
oresama::array前方宣言したときに
起こりうることは予想がつくよね?
それがstd名前空間だと動作が未定義だとのことだけども
何が違うのか分かります?
2022/12/26(月) 01:30:35.37ID:2gdEMUwk0
>>829
コンパイラ様はstd以下を思うままに特別扱いしてカオスでアドホックな最適化処理をいくらでも入れることが許されてる
2022/12/26(月) 01:51:58.67ID:YnLWxzzl0
>>830
>>825も指摘してるけどoresamaとstdの違いはそれくらいだよね?
具体的にどういう最適化をして鼻から悪魔を出すのかな?
まぁそんなことを分かる人はおらんかな...
2022/12/26(月) 02:20:44.42ID:OBkbHJZM0
>>831
コンパイラの内部に興味を持って調べたいならどんどんやればいいよ。
詳しい人が増えるならそれはたいへん喜ばしい!

でも、リッチな C++ コンパイラのソースコードを読んで様々な最適化がどう組み合わさるかまで把握するのは
相当に高い技能を持った達人でないと無理なのでこのスレ程度ではなんもわからんと思う。
世の中にはこれを保守している人がいるんだからありがたい話だよな。

私がどこかで見たおぼろげな記憶では標準テンプレート関連の一部で
マングルのルールが異なる (名前が短くなるようにしてる?) というのがあるので
変なことをすると破綻することもあるのかもしれない。
2022/12/26(月) 02:29:01.84ID:2Z6X9F6ZM
なぜこうもわざわざ未定義動作を踏み抜きたいやつが多いのか
2022/12/26(月) 02:33:59.35ID:OBkbHJZM0
コンパイラをナメてるからだろ。
「未定義動作つってもどうせこうなるだろう」という予測が出来ると信じている。
無理なのに。
2022/12/26(月) 05:51:34.26ID:+xP92Jxa0
まあ単なるテンプレートライブラリなのにstdだけを特別扱いして最適化を図るのはちょっとやりすぎな気がしなくもない
836デフォルトの名無しさん (ワッチョイ ebda-w5mw)
垢版 |
2022/12/26(月) 07:41:41.79ID:zTKHQ8850
clangのソースコードはC++プログラムの書き方の勉強になりますね
837デフォルトの名無しさん (スプッッ Sddb-lg2t)
垢版 |
2022/12/26(月) 08:06:50.83ID:FVIubv9sd
std::arrayってなんらかのusingであることが(コンパイラ側への制限として)許されてたりするんか?

もしarrayの実体がこんな実装だったら
namespase std::__internal {
template<class T, size_t>class array{...};
}
namespase std:: {
template<class T, size_t>using array=__internal<T,size>;
}

勝手にこれ書いたらまずくならんか?
namespase std{
template<class T, size_t>class array;
}
2022/12/26(月) 09:12:05.09ID:5S/2UDN2d
なるね
839デフォルトの名無しさん (ワッチョイ 8f7c-PRRE)
垢版 |
2022/12/26(月) 11:35:27.15ID:v25C8vnQ0
>>818
それやると特定のC++バージョン、特定のコンパイラでしか
コンパイルできないコードになりかねないし、
普通に #include <array> すればいいだろ。

それともそれが出来ない理由があるとか?
2022/12/26(月) 12:12:38.12ID:YnLWxzzl0
>>832
なるほどマングリング変えられるとリンカーエラーで
しばし悩むかもしれませんね

>>837
これはコンパイルで弾かれるので分かると思います

おふた方とも勉強になりました! 有り難うございます
しかし未定義動作ってほど酷いことにはならないのかなぁと思います
なめてますかね私?
841デフォルトの名無しさん (アウアウウー Sa1f-SvsN)
垢版 |
2022/12/26(月) 13:31:39.98ID:6bMfB0bxa
>未定義動作ってほど酷いこと

は?
2022/12/26(月) 13:38:20.67ID:OBkbHJZM0
>>840
未定義動作と定義されているんだから未定義動作としか言えんだろ。
843デフォルトの名無しさん (ワッチョイ b101-jXNG)
垢版 |
2022/12/26(月) 13:49:22.29ID:YnLWxzzl0
>>841
未定義動作とはコンパイルもリンクも通って実行できるけど
どんな動作をするか分からない(未定義)ので
事前に分かるコンパイルエラーやリンカーエラーに比べて
「酷い」と表現しました
いわゆる「鼻から悪魔」
2022/12/26(月) 13:51:12.76ID:YnLWxzzl0
>>842
まぁ規格に書かれちゃってるんだからそりゃそうですね
2022/12/26(月) 14:17:52.01ID:OBkbHJZM0
もしも「必ずエラーとして報告されるべき」みたいな仕様にしたら std の特別扱いが要るから
標準ヘッダのファイルに素朴に書くだけな実装はやりにくくなるし……。
846デフォルトの名無しさん (ワッチョイ 2b01-s0Sd)
垢版 |
2022/12/26(月) 14:22:21.57ID:uyDYkqVs0
void InitBoard(void) // 盤を初期化
{
int x, y;

for (y = 0; y < YMAX; y++)
{
for (x = 0; x < XMAX; x++)
{
board[x][y] = 0;
}
for (x = 0; x < XMAX; x++)
{
num[x] = 0;
}
}
}

この処理の無駄を省くコードおしえてください
2022/12/26(月) 14:26:27.90ID:A7MLr6bua
>>843
酷いとわかっているのに
なんでこの未定義動作だけ酷くはならないと思えるの?
2022/12/26(月) 14:26:50.08ID:9plh3gB/d
memset(board, 0, sizeof board);
memset(num, 0, sizeof num);
2022/12/26(月) 14:33:45.39ID:a6eE731v0
>>846
つbzero,ZeroMemory
2022/12/26(月) 14:39:30.42ID:EnLBjT8OM
標準に <iosfwd> あるくらいだし動機はわかるけども

あんま詳しくないけどモジュールはよってことなんかね?
2022/12/26(月) 14:44:20.75ID:2wvNEB42d
禁止と言われて、そうですかと聞き分ける人と、ゴネる人がいるってことだ。
2022/12/26(月) 14:49:02.84ID:YnLWxzzl0
>>847
>>821からの流れは
実際に「酷い」鼻から悪魔が出る処理系はないんじゃないかな?って問い掛けです
少なくともここのスレではコンパイルエラーやリンカーエラーになる事例は
指摘がありましたが「酷い」ことになる事例は出ていません(誰かもしあれば?)

なぜそう考えるかは名前空間oresamaでは合法で
名前空間stdのみに規格において例外的な規定がなされているからって程度です
>>845のようにエラーが明示的に出ないのも
酷いことにならんのじゃないかなぁと
私が考えてしまうことに貢献しているかも
2022/12/26(月) 14:50:30.84ID:OBkbHJZM0
>>846
std::fill を使うのが妥当じゃないかな?

memset でも普通は問題は起きないと思うけど
メモリブロック (バイト列) に対する操作だから board の型によっては
問題が起こることはなくもない。
2022/12/26(月) 14:51:24.85ID:YnLWxzzl0
>>851
そういうことではない

文法的にダブルスタンダードになってるのが気持ち悪い
名前空間stdもoresamaも同じ取り扱いである方が
文法的に美しいって感じているから
実際には最適化のためにstdは特別扱いが規定されている
2022/12/26(月) 15:04:20.66ID:rUBUe8yFa
(自分の環境だと)酷いことにはなってないから
未定義踏んでてもOK派?
勘弁してください
2022/12/26(月) 15:10:52.71ID:YnLWxzzl0
>>855
煽ってものらないよw 誰もそんなことは書いていない

酷いことになる事例を教えてねってことを書いています
どういうこと(最適化?)を想定してダブルスタンダードにしたのか
動機を知りたくないですか?
2022/12/26(月) 15:12:35.95ID:a6eE731v0
fill_n(num,__countof(num),0)
上のboardは自分で考えるんだ
2022/12/26(月) 15:26:40.53ID:OBkbHJZM0
>>854
自分が作ったライブラリの名前空間に何を追加されても正しく動く (または必ずエラーになる) ように保証してんのか?
各ライブラリごとの挙動に保証していることと保証してないことがあるのは当たり前のことだろ。
お前のライブラリについての保証はお前がするから「言語では」関知しないってだけで、
oresama に何を追加してもよいことが保証されてるわけではない。
2022/12/26(月) 16:14:39.95ID:YnLWxzzl0
>>858
たぶん伝わってないな
以下をユーザが自分のソースに書くのは>>820の言うように規格で禁じられている
namespace std {
template <class T, std::size_t N>
struct array;
}
同じくoresama::ARRAYなるカスタムのクラステンプレートが定義されていたとして
以下をユーザがソースに書くのは合法
namespace oresama {
template <class T, std::size_t N>
struct ARRAY;
}
これをダブルスタンダードで気持ちが悪いと思っている
最適化との説だけども
具体的なことを知っている人がいたら聞きたいな
2022/12/26(月) 16:17:49.67ID:+99B24rl0
>>846
そのboard[x[][y]はゼロフィルしても良い配列?
盤外に飛び出す桂馬飛びの高速判定テクニックとして実はboard[-1][-2]が壁のコードになっている
とかありそう
※ 全くの想像です
※ 未定義動作と言われても知らそんこの場合アセンブリコードが正しくて速ければええんじゃ
※ この場合2次元配列はやめてカラム数が2のべきの1次元配列であるべき
※ ここまで全くの妄想です
2022/12/26(月) 16:19:44.55ID:+99B24rl0
説明が抜けた;;;
board[-1][-2]が壁のコードになるような思想の場合は
board[0..][0..]にも当然盤を取り囲むように壁のコードが配置される
2022/12/26(月) 16:26:57.23ID:OBkbHJZM0
>>859
お前のライブラリの仕様はお前が決める、
標準ライブラリの仕様は言語仕様で決める。
そこになんの違いもありゃしねぇだろうが
2022/12/26(月) 16:30:53.99ID:/571GBxYM
>>862
一行目は違う
oresama::ARRAYの前方宣言が合法なのは
文法で規定されている
2022/12/26(月) 16:34:00.09ID:OBkbHJZM0
>>863
No.
許されているのはそのライブラリの設計がそうなっているからで許さない仕様のライブラリはあり得る。
2022/12/26(月) 16:44:01.34ID:/571GBxYM
>>864
前方宣言を許さない設計なんて本当にあるの?
2022/12/26(月) 16:54:23.72ID:QSsdq8qk0
>>865 あるよ。標準ライブラリがそう。
2022/12/26(月) 16:55:15.06ID:zTKHQ8850
かまってちゃん
2022/12/26(月) 16:55:21.28ID:OBkbHJZM0
>>865
すでに >>837 で示されてる。 見かけ上の名前は別名であるかもしれない。
別名ではない実装で書かれていることがはっきりしていて将来も変更されないと oresama::ARRAY について
保証されているならそれをあてにしてもいいんじゃないの。
で、それを保証するかどうかはライブラリを作ったやつの裁量次第。
2022/12/26(月) 17:07:33.78ID:/571GBxYM
>>866
誰か突っ込んでくれると思ってた
有難う!
2022/12/26(月) 17:11:08.06ID:+99B24rl0
namespaceはシンボルの衝突を防ぐためのしくみなのに
後から要素を追加できる仕様の方がおかしいfinalizeできるべき

だいたいnamespace oresama にX=サンが "bar.h" にて void oresama:foo()を定義して、
C++の標準ライブラリ仕様しか見ていないY=サンが "baz.h" にて同じシグネチャで異なる実装の
void oresama:foo() が実装されてしまう危険性が避けられない
のだから第三者によるnamespace内への後付けは本来言われるまでも無く禁止されるべき事項、

同一シグネチャで異なる実装があったらリンク時にエラーになる、と気体することは場合に掘っては全くできない
http://0xcc.net/blog/archives/000060.html

ちなVS2010だともっと簡単に(スタティックリンクでも)起こせるorz
2022/12/26(月) 17:13:25.25ID:+99B24rl0
訂正orz
誤1: C++の標準ライブラリ仕様しか見ていないY=サン
正1: oresamaのオリジナルの仕様書しか見ていないY=サン

誤2: 場合に掘っては全く
正2: 場合によっては全く
2022/12/26(月) 17:15:26.88ID:/571GBxYM
>>868
話がズレている
前方宣言は規格で合法だよ
(ただし名前空間std内を除く)
鼻から悪魔は出ない...と思う
2022/12/26(月) 17:58:37.42ID:OBkbHJZM0
>>872
前方宣言自体はいいよ。
そのライブラリ内でどう定義されているかわかっていて**妥当な前方宣言を出来るなら**。
将来のライブラリの更新があっても妥当でありつづける (または妥当でなくなったときに追従する) なら。

いちいちライブラリが保証していない内部仕様を調査して妥当かどうか確かめなきゃならない、どんな干渉が起きるかわからない
ってのは (ライブラリの仕様としては) 未定義じゃろ。
2022/12/26(月) 18:28:18.27ID:gLGPMU9jd
>>854
タブスタって何が?
stdに勝手に追加やってみた?
コンパイル通るぞ
文法的にどうのということと
できることとやっていいことは違うということを
区別しているか?
2022/12/26(月) 18:40:09.55ID:+xP92Jxa0
>>846
C言語はboard[x][y]のy側が連続に配置されるから for(x = ...){ for(y = ...){ ... } } の順にネストした方が効率的になる可能性が高いので俺なら
for (x = 0; x < XMAX; x++){
for (y = 0; y < YMAX; y++){
board[x][y] = 0;
}
num[x] = 0;
}
って書くと思う
2022/12/26(月) 21:17:05.02ID:YnLWxzzl0
>>873
前方宣言ってヘッダを見てやるから
逆に妥当でない前方宣言ってどんな場合のことを書いているのですか?
内部仕様を調査する必要もないと思うのですが?
2022/12/26(月) 21:18:30.60ID:YnLWxzzl0
>>874
>>859の通り
2022/12/26(月) 21:37:30.08ID:2gdEMUwk0
前方宣言のつもりがこういうので意味変わっても知らんぞ
http://d.hatena.ne.jp/DigitalGhost/20090216/1234793122
2022/12/26(月) 21:37:34.67ID:Luv0983hM
oresama 名前空間に前方宣言が追加されると未定義動作になるような例って実際作れる?
std についてはコンパイラマジックでも何でもありだが
880デフォルトの名無しさん (ワッチョイ f176-lg2t)
垢版 |
2022/12/26(月) 21:47:21.55ID:6ywYYiev0
未定義動作は未定義だよ

意図通り動いても、
デバッグするのに便利な例外が投げられても、
まともに動いてるように見えてメモリ壊してても、
コンパイルエラーになっても問題ない

コンパイラと実行環境は求められる動作が決まってないから
2022/12/26(月) 22:12:49.76ID:NZGNd7w4d
変な宣言が追加されるとSFINAEが狂うパターンとかあるかも。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況