C++相談室 part147at TECH
C++相談室 part147 - 暇つぶし2ch344:デフォルトの名無しさん
20/01/19 07:24:20.07 M/ehGL7C.net
>>334
たまたまLeaveCriticalSection()はエラーを返さないが
エラーを生じるブツだったらどうすんじゃ
まあエラー通知先があれば良いのでやりようはあるが
加速度的に手が込んだコードが必要になって全体が糞化していくんじゃ!

345:デフォルトの名無しさん
20/01/19 07:35:30.18 ilIPQsua.net
そもそもそのgotoを書きたくなるくらい深くネストしている時点でよくない説

346:デフォルトの名無しさん
20/01/19 08:03:07 Wel1D6/w.net
>>338
対象とするデータによっては単純に多重ループで処理するのがもっとも自然でシンプルなケースもあるだろう。
無条件に「ネストしたループ(・A・)イクナイ!!」と言うのも教条主義じゃね?

347:デフォルトの名無しさん
20/01/19 08:05:11 6oeBvQPN.net
教条主義というよりただのバカ

348:デフォルトの名無しさん
20/01/19 08:08:17 D5W6f6uH.net
gotoの使い方くらい知っておいた方が良いかと

349:デフォルトの名無しさん
20/01/19 08:51:50 2MN/c8bt.net
gotoにせよthrowにせよ、goto/throwの発生元が分からないのが受身になる側として辛い。
この点は、スタック情報へのアクセスが言語仕様として認められているJava/C#/Perl/Pythonに優位がある。

350:デフォルトの名無しさん
20/01/19 08:54:43 M/ehGL7C.net
throwの発生元は例外オブジェクトに情報を持たせれば良いじゃん?
gotoのジャンプ元は変数に情報を持たせれば良いじゃん??

351:デフォルトの名無しさん
20/01/19 09:02:38 2MN/c8bt.net
>>343
goto/throw発生元がバイナリで配布されている場合は、コードを書き換えられない。
クラス設計でやたらとメンバ変数をprivateにされると、クラスを利用する側はメンバ変数を古典的プリントデバッグできなくて難儀する。

352:デフォルトの名無しさん
20/01/19 09:04:12 2MN/c8bt.net
C++のprivate属性は厳しすぎ。readonlyアクセスできる属性があってもいいと思うんだ。

353:デフォルトの名無しさん
20/01/19 09:11:24 M/ehGL7C.net
>>344
バイナリ配布のブツの例外発生元を何でコードで知りたいのかがわからん…
アドレスがわかったところでソースが無いわけやし……
何事かを言わんとするための想定に無理が有るのでは…

354:デフォルトの名無しさん
20/01/19 09:12:59 2MN/c8bt.net
タイミング依存の不具合を追跡する必要に迫られると、当然ながら対話デバッグはできない。
C++のprivate変数が不具合に関与しているとわかってもランタイムで値を見れないのは辛い。
他人様の作ったC++クラスヘッダーを一時的に書き換えてコンパイルする羽目に。

355:デフォルトの名無しさん
20/01/19 09:17:35 2MN/c8bt.net
>>346
例外が吐かれた後にできることなんてほとんどなくてもスタックをダンプできるだけでかなり助かる。
特に自分が作ったわけではないレイヤーでthrowされた時には、スタック情報が役立つ。

356:デフォルトの名無しさん
20/01/19 09:20:25 2MN/c8bt.net
公式がデバッグシンボルを配布するご時世なのに、C++のスタック仕様はそれについていけていない。
デバッガを介することなくスタックをダンプできる手段が制約されすぎ。

357:デフォルトの名無しさん
20/01/19 10:49:09 CSTVsvTH.net
gotoはRAIIと相性が悪いってのが端的だろ

これはgotoが悪いと言うよりc++の言語仕様上のgotoの扱いが悪いって話

constexprで使えないとか規格が新しくなる度に不都合が増えていくよ

358:デフォルトの名無しさん
20/01/19 10:57:40 RfLx+x9F.net
gotoの使い方くらい知っておいた方が良いかと

359:デフォルトの名無しさん
20/01/19 11:07:08.87 fzpRtoDi.net
>>350
相性悪い?

360:デフォルトの名無しさん
20/01/19 11:07:41.05 CSTVsvTH.net
文字列パーサー内とかでの状態遷移に使うは推奨する
その他でのgotoは代替手段があるし、そっちの方が言語サポート良いからgoto使うのはバカのやること

361:デフォルトの名無しさん
20/01/19 11:12:09.60 CSTVsvTH.net
まあ不遇な原因はgotoが自由すぎて前にも後ろにも飛べるせいだろうね
変数のデストラクタを呼ぶべきかどうかフラグ管理でもしないとコンパイラが判断できなくなる。
goto使うならその自由さが必要な場面でこそ使うべきなんだよ

362:デフォルトの名無しさん
20/01/19 11:18:58.21 2MN/c8bt.net
>>354
プログラミング言語の世界では、前や後ろという表現は直観的にわかりにくい。
前や後ろは相対的なものであり、バックしているイテレータにとっては前はバックなのだ。
上と下なら直観的にわかるだろう。

363:デフォルトの名無しさん
20/01/19 11:21:16.66 CSTVsvTH.net
用語としては前後で統一されているような

364:デフォルトの名無しさん
20/01/19 11:22:22.50 RfLx+x9F.net
gotoの使い方を知らない初心者がこのスレにいるってのが不思議

365:デフォルトの名無しさん
20/01/19 11:27:05.68 2MN/c8bt.net
[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita
URLリンク(qiita.com)

366:デフォルトの名無しさん
20/01/19 11:29:47.11 6oeBvQPN.net
>>357
誤魔化さない説明が


367:ちゃんとできるやつがずいぶん少ないという、残念な状況が今の日本だ



368:デフォルトの名無しさん
20/01/19 11:38:04.97 RfLx+x9F.net
わざわざ複雑にしてまでgotoを避ける
って宗教だよな
使いどころで使う
それだけ

369:デフォルトの名無しさん
20/01/19 11:42:59.02 ZzFAG3/g.net
いうて必要になったことないや

370:デフォルトの名無しさん
20/01/19 12:30:11.44 L2mlhsAt.net
別にgoto使っても使わなくても馬鹿が書けば複雑なコードになるだろ。
そういう問題じゃない。
そもそもc++の標準ライブラリが例外投げる時点でgotoとの相性は最悪だよ。
一番末端の関数で、副作用もないようなもの以外使えんわ。

371:デフォルトの名無しさん
20/01/19 12:36:07.26 PgEzQeWd.net
gotoおじさんはたぶん例外安全性という概念をわかってない

372:デフォルトの名無しさん
20/01/19 14:43:36 6jfPBIzz.net
>>363
例外安全の定義が難しいのですが、gotoを使っても例外安全を保障することはできると思うのですが、いかがでしょうか。

373:デフォルトの名無しさん
20/01/19 15:06:56.67 PgEzQeWd.net
>>364
c++の標準ライブラリに関して例外安全とは何かは定義されてる
できるできないで言えばgotoかつ例外安全はそりゃできるでしょうよ
まずgoto関係なしに例外安全が相当大変であることを理解してから出直してくれ
そうじゃなきゃRAII、autoなんとかmakeなんとかの有難みも理解できてないのよ

374:デフォルトの名無しさん
20/01/19 15:08:40.81 RfLx+x9F.net
話題のすり替え

375:デフォルトの名無しさん
20/01/19 15:16:49.04 PgEzQeWd.net
>>366
話題を勘違いしてるのはお前だよ
お前は単にbreakでスコープの脱出することに対してgotoの方が簡潔と言ってるんだろう
そういう場合があるのは同意するけど今回の話題はそれじゃない
スコープの脱出になってるのはRAIIでリソースを安全に開放する前提だからだ
だからお前が言うべきはスコープをなくしてgotoを使うというなら
合わせてリソースをどのように安全に開放するかを説明しないといけない
場当たり的でない方法でね
そこをまったく説明できない以上お前はgotoおじさんと呼ばれ続ける

376:デフォルトの名無しさん
20/01/19 15:20:52.99 fzpRtoDi.net
>スコープをなくしてgotoを使う
なんか言ってることが変だと思ったらこんな条件付けてたのか。ブロックスコープ使えばいいじゃん。

377:デフォルトの名無しさん
20/01/19 15:26:55.90 RfLx+x9F.net
スコープを無くしてgotoで解放?
なんじゃそりゃ?
スコープを抜けないと解放されないぞ

378:デフォルトの名無しさん
20/01/19 15:27:43.53 PgEzQeWd.net
断わっておくけど
>>295 に対してgotoおじさんが >>297 と言ったのが発端
後出しはしていない
ちなみに295を書いたのはおれではない

379:295
20/01/19 15:31:10.41 2MN/c8bt.net
どんな劣悪な環境でも動く do{ } while(0); こそ絶対正義。

380:デフォルトの名無しさん
20/01/19 15:33:51.15 RfLx+x9F.net
>>295
do ループを抜けたすぐ下で資源を解放
って書いてあるように見えるけど

381:デフォルトの名無しさん
20/01/19 15:34:25.99 RfLx+x9F.net
>>370の勘違いってことでいいのかな?

382:デフォルトの名無しさん
20/01/19 15:42:01 PgEzQeWd.net
>>372
ああ確かに >>295 に対してってのは語弊があったかな
ID:cLOUBKze の発言を追ってみて
>>303
とかね
gotoおじさんかと思ったら別人なのね

383:デフォルトの名無しさん
20/01/19 17:03:31 6jfPBIzz.net
>>365
本来の「例外安全」の定義はもっと広い意味なのですが、あなたは、throwやcatchなどの「例外」が起きたときでもnewされたオブジェクトの削除などを行うという定義を採用されているようです。

break文を用いずにgoto文でブロックを脱出した場合でもオブジェクトは自動解放されるのをご存知ですか?

384:デフォルトの名無しさん
20/01/19 17:07:28 PgEzQeWd.net
>>375
自分は理解しているって言いたいわけね
じゃあさ >>273 のお題に対してgotoを使ったエレガントな方法を書いて
おれは思いつかないね
よろしく

385:デフォルトの名無しさん
20/01/19 17:11:06.93 4SQs66uE.net
そもそも一番のカスはこいつ >>276 >>286

386:デフォルトの名無しさん
20/01/19 17:42:21 fzpRtoDi.net
>>370

>>295に対して>>303

{



387: goto label; } label: でいいんじゃないかってことかと。 逆にどう解釈してRAIIとか例外安全とか持ち出したのか気になる。



388:デフォルトの名無しさん
20/01/19 18:24:30 6oeBvQPN.net
論点を増やそうとするのは苦しいやつの習性だね

389:デフォルトの名無しさん
20/01/19 18:46:40 PgEzQeWd.net
>>378
それだとdo-whileと変わんないだろ
gotoおじさんの論点てそれか?
人の事クソバカ言ってるわりに何の優位性があるのかわからんな

390:デフォルトの名無しさん
20/01/19 18:52:29 6oeBvQPN.net
そうだよ、変わんないよ
複合文だけでできることになんでわざわざdoなんて面倒くせえもん使わなきゃいけねえんだよ

391:デフォルトの名無しさん
20/01/19 18:52:32 PM2cmccN.net
Rust使えばすべて解決。

392:デフォルトの名無しさん
20/01/19 18:53:23 6oeBvQPN.net
まさかとは思うがブレースを開くのにdoだかforだか何らかのキーワードが必要とでも思ってたか?

393:デフォルトの名無しさん
20/01/19 18:56:46 PM2cmccN.net
俺は何の実績もないおまえの言うことより、あわしろいくや氏を信じるけどな。

394:デフォルトの名無しさん
20/01/19 18:57:26 yjllCGTd.net
>>378
噂のgotoおじさまもさすがにこのコードがいいなんて言わないでしょ

395:デフォルトの名無しさん
20/01/19 18:59:17 6oeBvQPN.net
>>384
ブレースを開くのにキーワードが必要か否かに実績は関係ない
他人のネームバリューにすがるしかなくなったか?

396:デフォルトの名無しさん
20/01/19 19:00:40 PM2cmccN.net
>>386
ネームバリューは関係ないんだよ。
あわしろいくや氏は信用できる。
おまえは信用できない。

397:デフォルトの名無しさん
20/01/19 19:01:36 4SQs66uE.net
>>387
俺はお前のあわしろいくや氏は信用できるという言葉が信用できない

398:デフォルトの名無しさん
20/01/19 19:02:52 PM2cmccN.net
>>388
俺のことは信用しなくていい。
あわしろいくや氏を信じろ。

399:デフォルトの名無しさん
20/01/19 19:15:30 ocqIlbpk.net
売名乙

400:デフォルトの名無しさん
20/01/19 19:29:04.71 yQO+Nq01.net
まさか do while 構文が論点だと思ってたんかな?
まあ本当はgotoを推す正当性が全くなくてごまかしてるんだろうけれど。
てかgotoと例外安全性はかなり綿密に絡んだ話だろ。誤魔化しすぎだわ。

401:デフォルトの名無しさん
20/01/19 19:45:18 6oeBvQPN.net
>>387
ヒゲ生やした教祖様のために死刑になった信者と同じだなw

402:デフォルトの名無しさん
20/01/19 19:46:34 fzpRtoDi.net
>>380
そのくらいしか思いつかなかったが、>>297はその程度の主張だったんじゃないの?
じゃあどういう主張しているとID:PgEzQeWdは解釈していたのかな。そっちが気になる。

403:デフォルトの名無しさん
20/01/19 19:46:39 6oeBvQPN.net
> かなり綿密に絡んだ話だろ

誤魔化しすぎというブーメランが脳天に突き刺さってるぞw

404:デフォルトの名無しさん
20/01/19 19:54:00 yQO+Nq01.net
なるほど。。こりゃ話しても無駄だな。

405:デフォルトの名無しさん
20/01/19 20:25:44 M/ehGL7C.net
gotoと例外安全性がどう絡むのかわからんボスケテ;

406:デフォルトの名無しさん
20/01/19 21:06:11 fzpRtoDi.net
話しても無駄以前に、結局gotoと例外安全がどう関係するのか一言も出てこなかったな。

407:デフォルトの名無しさん
20/01/19 21:10:50 CSTVsvTH.net
RAIIとgotoは混ぜられないだろ

408:デフォルトの名無しさん
20/01/19 21:13:01 AinWVopR.net
そらgotoでリソース開放ルーチンに飛ぶようなCスタイルのプログラム書くと
例外飛んできたときに死ぬって話でしょ
(いくらC++にfinallyが無いからってgotoでリソース開放ルーチンに飛ぶのはダメ)
ただし元々の質問には関係ない話なんだがな

ところでC++にfinallyが無いのはちょっと良くないよね
今となってはラムダで自作できるようになったからいいけど

409:デフォルトの名無しさん
20/01/19 21:16:51 fzpRtoDi.net
>>398
その「混ぜる」って具体的にはどういうことを言ってるんだろう。

410:デフォルトの名無しさん
20/01/19 21:24:53 AinWVopR.net
基本的に break や return も生き先の決まった goto なので
余ほど変な使い方をしない限りRAIIと goto を混ぜれないって事はないよなぁ
むしろ RAII を使わないで goto でC系のリソース開放をしていた場合にハマるって話では

まぁでもこれは
do{
  if( error ) break;
}while(0);
//開放処理
return;
でも同じことだし、元の質問には関係ないんだが

411:デフォルトの名無しさん
20/01/19 21:34:33 RfLx+x9F.net
まだやってんのか

>>377
それ

412:デフォルトの名無しさん
20/01/19 21:40:42 RfLx+x9F.net
do {
if(...) break;
} while (0);

よりは

{
if (...) goto label;
}
label:

の方が良い

という�


413:モ見に賛成 >>303ではないけど



414:デフォルトの名無しさん
20/01/19 21:44:50 RfLx+x9F.net
まあどっちでも大差ないけど

415:デフォルトの名無しさん
20/01/19 21:47:25.68 RfLx+x9F.net
{
{
if (...) goto label;
}
}
label:
これはbreakじゃ無理

416:デフォルトの名無しさん
20/01/19 21:57:15 RfLx+x9F.net
{
switch (...)
{
case ...: goto label;
}
}
label:

これも無理

417:デフォルトの名無しさん
20/01/19 22:11:05 ByUy1Erg.net
while(0)とか意味不明なコードよりgotoでスコープ抜ける方がはるかにシンプルだわな

418:デフォルトの名無しさん
20/01/19 22:15:20 RfLx+x9F.net
一応 do while(0) の使い方も覚えておいた方が良い
他人のコードを見たりマクロで使ったり
する事もあるだろうから

419:デフォルトの名無しさん
20/01/19 22:17:28 JMAoH3/H.net
普段のdo whileもwhile(0)って書くなど弊害が出るのでやめた方がいい

420:デフォルトの名無しさん
20/01/19 22:19:27 ByUy1Erg.net
ループするつもりもないのにループの構文使うのは悪手だと思う

421:デフォルトの名無しさん
20/01/19 22:27:26 RfLx+x9F.net
>>409
日本語で

422:デフォルトの名無しさん
20/01/19 22:33:02 fzpRtoDi.net
そこはまぁ、ループではあるけれども同時にbreakが使えるブロックでもあるわけで、
実際do-whileなんてほとんどがそういう使い方しかされていないわけだし。
ループできる構文でループしないのはbreakできる構文でbreakを使わないのと
同じようなものかと。

423:デフォルトの名無しさん
20/01/19 22:36:02 JMAoH3/H.net
>>411
do whileしてるのになぜか1回しか実行してないのに気付くのに時間がかかる
習慣で書くのでwhile(0)に気づけない

424:デフォルトの名無しさん
20/01/19 22:48:25 PgEzQeWd.net
こんなささいな違いは個人の好みでいいと思う派
do-while使わない派の言い分もわからなくもないが、
ソースを読む場合gotoだってgoto先を確認しないと意図が理解できないだろ
label名を考える必要があるのもちょっとめんどい
なのでこんなのどっちでもいい
ちなみにrust方式もブロックの先頭にラベル付いてるのは若干違和感覚える

425:デフォルトの名無しさん
20/01/19 22:50:45 RfLx+x9F.net
>>413
誰か解説よろしく!

426:デフォルトの名無しさん
20/01/19 23:07:09 Wel1D6/w.net
どっちのやり方でも構わないけど、リソース◯◯を自動解放するためのブロックだとか意図を示すコメントを付けておいてくれればそれでいい。

427:デフォルトの名無しさん
20/01/19 23:13:56.14 AinWVopR.net
↑だからその方法だと例外安全が・・・
C++だとリソース開放は RAII か finally かしか幸せになれない

428:デフォルトの名無しさん
20/01/19 23:17:22.36 RfLx+x9F.net
その方法
ってどの方法?

429:デフォルトの名無しさん
20/01/19 23:23:50.28 Wel1D6/w.net
>>417
誤解させたかもしれないから補足すると、どっちのやり方もと言ったのはただのブロックかdo whileかという話のことで、どちらにせよスコープを抜けて破棄されることを想定していた。
解放ルーチンにとばすことは端から考えてなかったよ。

430:デフォルトの名無しさん
20/01/19 23:47:54 L2mlhsAt.net
解放ルーチンにとばすくらいしかgotoの有用な使い方なんてねーだろ。
だからRAII、例外安全の話になってるわけだが
もう意地になって意味もわからずgotoにこだわってる馬鹿がいる。

431:デフォルトの名無しさん
20/01/20 00:05:06 ThUag/92.net
finally相当のデストラクタをラムダ式で渡すクラスのインスタンスを作ればいいじゃない、
で済まされてしまいそうだがやはりfinallyはあったほうがいい。

432:デフォルトの名無しさん
20/01/20 01:01:38.84 KvAer05C.net
「解放ルーチンにとばすくらいしかgotoの有用な使い方なんてねーだろ。」
って思えるぐらい、Cではこの技法が多用された
なぜなら真実は逆で
「gotoでとばすぐらいしか開放ルーチンをまとめる方法なんてねーだろ」
だったから多用された
A→Bでなくて、実はB→Aだったって話
なんだけど、あまりにもB→Aが多用されたから
数の暴力で逆のA→Bも成り立つと感覚的に思ってしまう
だが本当にそうだろうか、gotoに開放ルーチンに飛ばす以外の利用法は無いのだろうか
模索してみよう、というのがスレの流れ
スレがその流れになるのは自明で
何故ならC++においては「gotoで開放ルーチン」は例外安全の意味で完全な悪手になったから
初めから勘定に入らないし、考える意味もないし、議論の余地もない
他の利用方法を前提に話すのは当たり前で既定路線


433:



434:デフォルトの名無しさん
20/01/20 01:58:07 wNCym70P.net
スレの流れはvectorの動的な解放手段についてです

435:デフォルトの名無しさん
20/01/20 05:25:12.27 KSbNzMqr.net
Javaはgotoを無くした先進設計だからな。

436:デフォルトの名無しさん
20/01/20 07:11:09 SZK6NMcF.net
>>410
ほんこれ
メインフレーム時代から「なぜ0を足すんだろう」なんてあったけど
そういう謎コード書いて俺スゲーってやる厨二病は痛いよな

437:デフォルトの名無しさん
20/01/20 07:59:32 hWOi4sNW.net
つまりgotoと例外安全がどうとか言っていた人はこんなC時代の技法を念頭に置いていたわけか。

if (fail) goto FINAL;

FINAL:
後始末

gotoとRAIIの相性が悪い、混ぜられないという話はまた別なのだろうか。

438:デフォルトの名無しさん
20/01/20 08:30:41 ItoFGwWk.net
>>426が例外安全かどうかとgotoは関係ないんじゃない?

>>273>>426のコードも関係ない

ただ例外安全て言いたかっただけと思う

439:デフォルトの名無しさん
20/01/20 09:55:56 SZK6NMcF.net
>>273
vector<usigned char> huge;
//do something
huge.clear();

gotoは全く関係ない

440:デフォルトの名無しさん
20/01/20 10:09:57 rZl1icD3.net
>>428
vector自体が確保したメモリが解放される保証がないのでNG
とっくに答えは書かれているのだから今からどやるのやめろ

441:デフォルトの名無しさん
20/01/20 10:14:06 SZK6NMcF.net
保証しないってどこに書いてあったっけ?

442:デフォルトの名無しさん
20/01/20 10:15:25 JGG/x92o.net
>>275
これで解決済みだよなぁ
std::vector<...>{}.swap(v)

443:デフォルトの名無しさん
20/01/20 10:15:47 N9WxJN6X.net
>>428
>>291,292辺りを見てこい

444:デフォルトの名無しさん
20/01/20 10:17:29 N9WxJN6X.net
もちろんclear()の仕様も確認しとけ

445:デフォルトの名無しさん
20/01/20 10:18:17 ThUag/92.net
>>292 で実装依存の最適化について言及がある。
あるサイズを超えるまではヒープではなくスタックを使うことで高速実行を期待する実装はあり得ると思う。
vectorの具体例は知らないが、EASTL::basic_stringはそうやってる。

446:デフォルトの名無しさん
20/01/20 10:40:56 SZK6NMcF.net
>>433
だから、どこに書いてあったのかと聞いているんだが

447:デフォルトの名無しさん
20/01/20 11:04:21 wNCym70P.net
>>431の言う空の一時オブジェクトとswapという常套手段で解決するのに質問者のクズは場当たり的などと難癖をつけ、
さらにじゃあnew/deleteしろよというまっとうな意見にバカを言うななどとほざいた結果がこのくだらねえ流れだよ

448:デフォルトの名無しさん
20/01/20 11:09:12 rZl1icD3.net
>>435
c++の規格書は有料だけど持ってんの?
ぐぐればstack overflowとかいくらでもひっかかるけど調べた?
これは割りと知られた仕様だと思うけどね
実際g++とかでやってみればわかるけどclearしてもcapacity変わんないから

449:デフォルトの名無しさん
20/01/20 11:14:14 wNCym70P.net
少なくともVC2019はclearでデストラクタが呼ばれてる

450:デフォルトの名無しさん
20/01/20 11:20:47 N9WxJN6X.net
>>438
それはvectorに格納した要素ごとのデストラクタの話であって、それらを格納するためにvector自身が確保した領域が解放されるわけではないだろ

451:デフォルトの名無しさん
20/01/20 11:29:18.51 SZK6NMcF.net
>>437
情報持ってるのに出してくれないのはわかったよ、無理にとは言わん
g++の挙動については情報ありがとう

452:デフォルトの名無しさん
20/01/20 11:53:45 JGG/x92o.net
むしろclearで解放せず、capacityが減らないことを保証してほしいよね
capacity減らす手段は用意されているのだから

453:デフォルトの名無しさん
20/01/20 12:32:03.74 xWGHAxxP.net
結局何を保証して欲しがってるのかさっぱりわからんが
言語仕様はvectorの何やらはもちろん、deleteだってfreeだって、OSにメモリ領域を確実にお返しになる事なんか保証してない事は覚えておこうな

454:デフォルトの名無しさん
20/01/20 12:33:54.17 RAANiraF.net
>>441
> capacity減らす手段は用意されているのだから
いや>>432はそれが確実じゃないって話だろ
まあそんな実装は


455:見たことないけど



456:デフォルトの名無しさん
20/01/20 12:52:13 JGG/x92o.net
>>443
いや空とswapすれば減るじゃん

457:デフォルトの名無しさん
20/01/20 13:22:01 hv8WW6TF.net
>>444
空とswapは場当たり的に見えて却下と質問者様がおっしゃったからこの論争になったんだぞ

458:デフォルトの名無しさん
20/01/20 13:22:46 SZK6NMcF.net
>>442
OSに返すかどうかの問題じゃねえだろ
allocatorが管理するサブプールに還元でもいいわけで

459:デフォルトの名無しさん
20/01/20 14:27:22 0GX6odYx.net
概出鴨試練蛾
do{...}while(0); と
{...} の違いって決定的なのは何かって
break; を入れられるかどうかだと思うんだけど
ループじゃないものに do{...}while(0); を使うのは可笑しいって派の人らは
後者に break; 入れられるようにしておけば良かっただけなんだよな

460:デフォルトの名無しさん
20/01/20 14:50:16 hv8WW6TF.net
ループする気もないのにループ構文を使うのは誤解の元
同様のことは他にもいくつも手段はあるのにループを使う必要がない
モダンな書き方だと[&](){...}();

461:デフォルトの名無しさん
20/01/20 15:02:12 KVDidwnp.net
違うだろ
while使わないよ派はgotoで充分だろ
ブロックを抜けるbreakが欲しいのは現状while使うよ派だろ

462:デフォルトの名無しさん
20/01/20 15:15:43 0GX6odYx.net
once{};
みたいな構文で良いんじゃね
マクロとか書けば

463:デフォルトの名無しさん
20/01/20 15:21:36 hv8WW6TF.net
マクロ()
ベターCとか03で脳みそ止まってんだろうなw

464:デフォルトの名無しさん
20/01/20 15:26:55.87 0GX6odYx.net
C++スレだからlambdaでも許されるけどCだと使えないやん?

465:デフォルトの名無しさん
20/01/20 15:29:38.41 hv8WW6TF.net
ほぉ、じゃあお前はCで使える文法のみでC++を書いてんだな
ボケてんのか?

466:デフォルトの名無しさん
20/01/20 17:52:26.33 SZK6NMcF.net
>>447
GOTO文有害説で言われる無条件分岐のスペルがbreakであろうとgotoであろうと同じことだ
同じ意味合いのことを書くために、ループでないものをループという嘘をつくことに俺は反対だ

467:デフォルトの名無しさん
20/01/20 20:28:01.32 KSbNzMqr.net
結局、gotoは使わないほうが良いのですか?

468:デフォルトの名無しさん
20/01/20 20:51:28.03 SZK6NMcF.net
{ から } までを1命令と読めるようにするのにgotoは無用と言っているに過ぎない
そのようにまとめようとしていないときやgotoを使っても1命令と読める場合にまで
GOTO有害説に囚われ強弁するのは何も分かってないやつのすることということだ

469:デフォルトの名無しさん
20/01/20 20:56:48.81 rZl1icD3.net
つまんないことに拘りすぎ
どっちでもええがな

470:デフォルトの名無しさん
20/01/20 21:36:31 hWOi4sNW.net
>>448
今だとdo-whileでループする方が誤解の元になりそうな。

471:デフォルトの名無しさん
20/01/20 21:38:12 jzGRQ/VP.net
#define BLOCK(stmt) do { stmt; } while(0);

BLOCK(
if (error) break;
);

472:デフォルトの名無しさん
20/01/20 21:53:50 IuISEeYy.net
do{}while(0)とか初めて見たけど
ダサすぎてそりゃ思いつかねーわwww

473:デフォルトの名無しさん
20/01/20 21:55:40 dqQuCzGx.net
結局goto有害説に流されないオレカッケーが言いたいだけだろ?
それでもgotoが有効な場面なんかないけどな。禁止にしても問題なんかない。

474:デフォルトの名無しさん
20/01/20 22:00:17.76 SZK6NMcF.net
GOTO有害説に流されるのがオレカッケーと思っているようだな
アホwバカwww
禁止にしたら問題あるからlongjmpやthrowができてきたんだよ

475:デフォルトの名無しさん
20/01/20 22:11:05 KSbNzMqr.net
つまり、使わないほうが良いのですね。
なんとなくですがわかりました。

476:デフォルトの名無しさん
20/01/20 22:12:08 SZK6NMcF.net
Javaから帰ってこなくていいからな
永久にバイバイ

477:デフォルトの名無しさん
20/01/20 22:30:44 dqQuCzGx.net
>>462
今時、例外の問題も把握してないでlongjumpとかthrowとか言ってんのか。。
馬鹿にもほどがあるわ。
負け確定だから泥仕合にしようってのはわかるがそろそろ引っ込めよ。

478:デフォルトの名無しさん
20/01/21 05:17:13 AnB6dumh.net
>>459
while(0)の後ろにセミコロン付けちゃダメ

479:デフォルトの名無しさん
20/01/21 07:25:59 XinnYwlJ.net
>>465
GOTO有害説に流されているという指摘は否定しないんだな?w

480:デフォルトの名無しさん
20/01/21 08:47:12 pAPT/+0o.net
>>459
定義部 { stmt; } のセミコロンも不要かな。
プリプロセッサを通した変換結果を見て気付いた。

って言うか、関数形式マクロの実引数に
空白とかカッコとかを含めることができるのね。

481:デフォルトの名無しさん
20/01/21 08:50:21 liyEgHWj.net
>>468
確かカンマも使えないはずだし、>>459のマクロは使い勝手は悪く制御構造も隠蔽する有害な使い方だろう。

482:デフォルトの名無しさん
20/01/21 09:35:24 ecU7KawI.net
gotoを使わないことが目的になって
余計分かりにくくしてるアホな例

483:デフォルトの名無しさん
20/01/21 09:49:43 Hkcle0K4.net
goto論争はくだらない
一方でラムダ使ったループ脱出は議論の余地がある
これがエレガントに見えるのか
パズルに見えるのか
自分の場合どちらかといえば後者
ラムダ自体は多用するけど

484:デフォルトの名無しさん
20/01/21 11:17:56 Sppu2iw7.net
盲目的にgoto=悪と信じて、かえって読みずらいコード書く奴ってほんとアホだよなあ

485:デフォルトの名無しさん
20/01/21 13:51:41 XinnYwlJ.net
>>470
ほんこれ

486:デフォルトの名無しさん
20/01/21 13:54:41 XinnYwlJ.net
gotoの何が悪いのかわかってないやつをもう少しいたぶってやろうと思ってたけど
途中で可哀想になってきて答え書いてやってるのになあ。。。

487:デフォルトの名無しさん
20/01/21 18:52:44 xueGtX5x.net
>>460
do { } while(0)
は自分は見たことがある。
忘れてしまったが、確か、#define マクロの定義部分で使われていて、目的は、
マクロ全体が一つの分の用に実行されて欲しいことであったようだった。
#define マクロ名() do {\
・・・\
・・・\
} while(0)
のような感じだったと思う。

これなしで裸で書くより安全になる場合があった気がする。

488:デフォルトの名無しさん
20/01/21 18:57:29 fxsKQzaN.net
if (...) マクロ();
else ...

489:デフォルトの名無しさん
20/01/21 18:57:46 xueGtX5x.net
>>475
忘れてしまったが、おぼろげながら何か以下の様なことに関連していたような記憶がある。
C/C++では、if 文の直後は {}がなくても書くことが出来てしまう。
それで、
if (条件式)
マクロ関数名();
のように書いた場合、マクロの定義部を単なる {} で書くより安全な場合があったような
気がする。

忘れた。

490:デフォルトの名無しさん
20/01/21 19:00:56 xueGtX5x.net
>>476
あ、その場合だね、多分。
#define aaa() {・・・}
と定義してしまった場合、
if (...) aaa();
else ...
と書くと、
if (...) {};
else ...
と展開されてしまい、else の部分がエラーになってしまう。ところが、
#define aaa() do {・・・} while(0)
と定義していると、
if (...)
do {} while(0);
else ...
と定義されて、正しく動作する。

491:デフォルトの名無しさん
20/01/21 19:03:11 xueGtX5x.net
URLリンク(stackoverflow.com)
↑に書いてあった。

492:デフォルトの名無しさん
20/01/21 19:11:44 jtyzl32v.net
それは11年前のネタだからそうなってるけど現代C++ならラムダ式で書くべき内容

493:デフォルトの名無しさん
20/01/21 19:19:17 fxsKQzaN.net
マクロでしか書けない物もあるんだよ

494:デフォルトの名無しさん
20/01/21 19:19:18 jXO8TLK9.net
大昔の工芸品みたいやな

495:デフォルトの名無しさん
20/01/21 19:24:51 fxsKQzaN.net
ていうかなぜラムダ式?
考える順は以下じゃない?

関数
インライン関数
テンプレート関数
マクロ

496:デフォルトの名無しさん
20/01/21 19:35:47 jtyzl32v.net
>>483
そこで回答されている
#define FOO(x) do { foo(x); bar(x); } while (0)

#define FOO(x) [&] { foo(x); bar(x); } ()
と簡潔に書ける
そのQAの内容は今のC++におけるdo-while(0)の有用性を示す内容ではない

497:デフォルトの名無しさん
20/01/21 20:01:36.85 fxsKQzaN.net
ああ、そういうことか
do while に対するメリットがないと
互換性から do while を選ぶことになりそう

498:デフォルトの名無しさん
20/01/21 20:17:22 V9u70PsA.net
ラムダ式はc++11からか
使えない環境は結構あるんだろうな
近付きたくない

499:デフォルトの名無しさん
20/01/21 20:20:59 m86EWX9f.net
>>484
最適化前提にしないと代替とは言えない�


500:ヒ



501:デフォルトの名無しさん
20/01/21 20:21:55 OieZoAm+.net
そんな用途でマクロなんか使わねーわ。ばかか。

502:デフォルトの名無しさん
20/01/21 21:35:08.93 XinnYwlJ.net
スコープが効かねえ毒だかんな

503:デフォルトの名無しさん
20/01/21 22:01:33.56 fxsKQzaN.net
>>481

504:デフォルトの名無しさん
20/01/21 22:03:37.86 XinnYwlJ.net
__LINE__がいるのとかな

505:デフォルトの名無しさん
20/01/22 00:05:18 LIwEls05.net
>>484
JavaScriptだとそうかいても速度差がないかもしれないけど、C++だと、
そう書いた場合は、関数を定義してから、マシン語の call 文でその関数が
呼び出されるので結構なオーバーヘッドとなる。
JavaScriptの場合は、どう書いてもオーバーヘッドがあるからそのくらいの
オーバーヘッドは体感速度に登ってこないのでどっちでも良いだけ。

506:デフォルトの名無しさん
20/01/22 00:20:06 2biZgMt+.net
>>492
ラムダ式はインライン展開されるからオーバーヘッドにはならない

507:デフォルトの名無しさん
20/01/22 01:14:20 eHIdhO0H.net
error: no member named 'emplace_back' in 'std::__1::vector<int,
std::__1::allocator<int> >'; did you mean '__emplace_back'?
v.emplace_back(d);
^~~~~~~~~~~~
__emplace_back
/Library/Developer/CommandLineTools/usr/include/c++/v1/vector:696:10: note:
'__emplace_back' declared here
void __emplace_back(const value_type& __x) { push_back(__x); }
^
1 error generated.

push_backは普通に使えるんですけどemplace_backは何故か上記のようなエラーが出てしまいます
一応コンパイラに言われた通りに__emplace_backに変えれば動きはするんですが、普通にアンダーバーなしで
動かすにはどうしたらいいんでしょうか。環境はmacの10.14です。

508:デフォルトの名無しさん
20/01/22 01:26:38 2biZgMt+.net
>>494
OSだけ書かれても環境がわからんけどこれに見える
URLリンク(cpprefjp.github.io)

509:デフォルトの名無しさん
20/01/22 09:21:16 RBeGE/46.net
>>493
それ保証されてる?
最適化オフでは関数オブジェクトのままじゃないの?
最近のc++はデバッグビルドが使い物にならないことが多くてマジ困る

510:デフォルトの名無しさん
20/01/22 09:24:55 dJnLloAw.net
>>496
最適化するかしないか自分で選べるんだから、言語のせいじゃないと思うんだ。

511:デフォルトの名無しさん
20/01/22 09:47:45 s6VTVCIo.net
最近というか昔からだなデバッグまわりがクソなのは
ほんと標準化プロセスは現実のプロダクト開発に関わったことのない言語オタクの遊び場に見えるわ
デバッグをないがしろにするなと

>>497
端的にテンプレートが原因だから言語のせい
というか誰のせいかどうでもいいから解を提供しろと

512:デフォルトの名無しさん
20/01/22 10:28:10 dJnLloAw.net
>>498
最適化設定を変えることが解になると思って言ったんだけど、そうはいかないことがあるの?

デバッグまわりがクソだと言うなら、相手はまずコンパイラ&デバッガのベンダであって、言語の標準化は
あんまり関係なくね?

513:デフォルトの名無しさん
20/01/22 10:34:22 Oj6zQLXh.net
インライン展開するかどうか含めて
最適化はコンパイラ依存

パフォーマンス測定やチューニングは
実際の環境でやらないと

可能性で言えばマクロが一番インライン展開の可能性が高い
(コンパイラが賢すぎて同一コードを共有するとかない限り)

514:デフォルトの名無しさん
20/01/22 10:50:51 kHABv+Er.net
マクロはソースの字面を読み替えるだけ
機械語の命令シーケンスを開いたサブルーチンにするインライン展開とは全く別な話

515:デフォルトの名無しさん
20/01/22 12:06:37.54 OzkwmLpy.net
>>500
マクロは、C


516:言語の時代から「前処理(preprocess)」として処理され、 コンパイル作業が入る前にその場にトークンとして展開されるだけと 仕様で決まっています。勝手に関数になる可能性はほぼ0です。



517:デフォルトの名無しさん
20/01/22 12:28:55 S75Q14iC.net
挙動が仕様通りになるならコンパイラは何やってもいいんだよ(と仕様で決まってる)
マクロだったものに関数呼び出しを仕込むのもコンパイラの自由だ
実際同じ処理の塊があっちこっちに出てきたらまとめて関数(みたいなもの)にするコードサイズ最適化は普通にやる可能性がある

518:デフォルトの名無しさん
20/01/22 12:40:53 Oj6zQLXh.net
>>501
オーバーヘッドを語ってるんだから
どういう手順でバイナリになるかは関係ない
バイナリになった状態が全て

>>502
>>500にそう書いてるけど

519:デフォルトの名無しさん
20/01/22 13:12:02.54 kHABv+Er.net
>>504
マクロ展開は最適化が始まる前の話だつってんだよ、わかんねーやつだな
#define a(b,c) b * 2 + c * 2
a(x, y) //これは
x * 2 + y * 2 //こうしろというだけの指示で
(x + y) * 2 //このような変形は意味していないし
してはならない
a(x, y) * z //こういうとき困るだろうが

520:デフォルトの名無しさん
20/01/22 13:18:49.85 kHABv+Er.net
インライン展開されるかどうかは、そのコード片がマクロの展開結果かどうかには関係ないってことだぞ
こんなこと、いちいち言わなきゃわからんようだから付け足しておく

521:デフォルトの名無しさん
20/01/22 13:34:41.13 S75Q14iC.net
>>505
最適化をいつ始めるかなんてそれこそコンパイラ次第なんだけど

522:デフォルトの名無しさん
20/01/22 13:41:29 yb939hMs.net
つまりマクロはインライン展開されやすいという主張は引っ込めるわけだな

523:デフォルトの名無しさん
20/01/22 13:43:39 yb939hMs.net
都合悪くなると
どうせいつもの手で逃げるだろうけどな
尻尾巻いたやり取りは残るぜ

524:デフォルトの名無しさん
20/01/22 14:44:17 54HMiZ6v.net
>>505
#define a(B,C) ((B) * 2 + (C) * 2)

>>498
>ほんと標準化プロセスは現実のプロダクト開発に関わったことのない言語オタクの遊び場に見えるわ

ほんそれ

525:デフォルトの名無しさん
20/01/22 14:49:21 kHABv+Er.net
>>510
それはおまえさんの勝手な思い込みだよ
x * 2 + y * 2 * z
という結果を意図して使うこともできるのは
マクロに特有の機能で今さら変更できなくなっている

526:デフォルトの名無しさん
20/01/22 14:51:21 54HMiZ6v.net
意図して出来るのは知ってるが
敢えてやらないんだよ

527:デフォルトの名無しさん
20/01/22 15:11:37.83 s6VTVCIo.net
>>499
デバッグのために最適化切ると激遅になる問題が散見されるという問題にたいして
最適化設定を変えるという解がナンセンス
そりゃpragma駆使して手で細かく切り替えりゃ可能だろうがそんなことやってられない

528:デフォルトの名無しさん
20/01/22 15:11:48.33 kHABv+Er.net
オマエガナー(aary

529:デフォルトの名無しさん
20/01/22 15:13:12.36 kHABv+Er.net
>>512
おまえが510で持ち出したような括弧が自動的に付くような規格改定が行われない理由を考えたことがあるか?

530:デフォルトの名無しさん
20/01/22 15:13:39.10 Oj6zQLXh.net
>>505
多分比較してる内容が噛み合ってない
マクロを展開した結果と直接記述と
が同じなのは当然
プリプロセッサなわけだから
そうじゃなくて
マクロ、インライン関数、通常の関数の比較の話
当然最適化の期待度は
マクロ(直接記述)>インライン関数>通常の関数

531:デフォルトの名無しさん
20/01/22 15:18:02.26 Oj6zQLXh.net
>>505
そもそも最適化ですらない話を持ち出してるのか
話の流れと全く関係ないですね

532:デフォルトの名無しさん
20/01/22 15:32:14.07 s6VTVCIo.net
>>499
ベンダの責任っていうのは一見もっともでそれがまさにc++標準化メンバーのスタンスだ
でも例えばお前はSFINAE関連のデバッグどうやってるよ?
いくつかツールはあるが導入が難しいか頼りないものばかりだ
そんな状況がずっと続いている
このあたりが改善するには言語コアを設計する時点からどんなデバッグ機能が必要か考えるべきってのがおれ�


533:フ主張 作業フローを理解しない人が無邪気にこれが入ればさらにソースコード短く書けまっせレベルの議論で機能追加を考えるべきでない



534:デフォルトの名無しさん
20/01/22 15:34:50.28 2biZgMt+.net
機能を使うかどうかはお前の判断でお前の責任
勝手に機能使っておいて八つ当たりすんな

535:デフォルトの名無しさん
20/01/22 15:50:53.24 LkBGzo9o.net
>ほんと標準化プロセスは現実のプロダクト開発に関わったことのない言語オタクの遊び場に見えるわ
+1

536:デフォルトの名無しさん
20/01/22 15:53:26.36 2biZgMt+.net
江添みたいなのしかいない日本と違って、普通の国の委員は企業の代表として参加しているのでその指摘は的外れ

537:デフォルトの名無しさん
20/01/22 15:57:43.58 OzkwmLpy.net
>>503
関数になっているものを inline 展開する処理系は多数ありますが、
プログラマがせっかく展開して書いてあるものをわざわざ関数に戻す処理系
はめったにないのです。
また、そのような最適化は人間には簡単に思えるものですが、機械にやらせようと
するととても大変です。マクロ展開される前のマクロ関数の状態ならまだ
できるのですが、コンパイラの中で最適化層と前処理層がかけ離れた位置に
あるので、もしやりたければ最適化層だけでそれをやることになり処理がとても重くなります。
まず、コンパイル後に出来上がった中間コードのなかから同一のパターンを見出すのが
ものすごく時間が掛かります。それから全く同じではない場合への対処が機会は苦手です。

538:デフォルトの名無しさん
20/01/22 15:57:58.58 kHABv+Er.net
>>516
最後の2行とそれ以前が論理的に繋がってないぞ

539:デフォルトの名無しさん
20/01/22 15:58:35.89 kHABv+Er.net
>>517
506で牽制しておいたはずなんだが
言わなきゃわからんのではなく、
言ってもわからんやつのようだな

540:はちみつ餃子
20/01/22 18:28:00.61 lnnB9FBg.net
>>516
> 当然最適化の期待度は
> マクロ(直接記述)>インライン関数>通常の関数
現代のコンパイラの最適化機構はかなり複雑で、どのように最適化が効くか予想するのは無理。
素朴な処理系ならなんらかの傾向がある場合もあると思うけど、一般化できるような話ではないよ。
普通の関数はインライン関数より呼び出しのコストは確かに大きいけど、
全体のコードサイズが大きくなるとキャッシュメモリからあふれやすいといった話もあって、
トレードオフになってる要素がある。
それに、主要なコンパイラは inline キーワードで修飾してもしなくてもインライン化が効果的ならインライン化するし、
効果的でないならしないよ。
inline 関数として定義すれば各コンパイル単位の中に必ず定義もあるわけだから、
LTO が有効ではない状況では結果的にインライン化しやすい条件がととのっているとは言えるんだけど、
逆に言えば LTO を有効に出来るならどうでもよくなるわけだし。
いずれにしても、そんな微々たる速度が気になるような場合ってそんなにあるか?
速度が問題になってから実測しろよ。
状況によってどうとでもなるんだから、具体的な状況を示さずにどれが速いとか言ったってかみ合うわけないだろ。

541:デフォルトの名無しさん
20/01/22 18:44:11.63 0ayd3B3Q.net
>>525
一般的な期待度の話
当然例外はある
コンパイル単位が別で
関数を定数パラメーターでコールした場合
なんかが差が大きくなる
レジスタ退避やスタックポインタのアラインメント調整、スタック拡張、AVXの準備関数コール
もそれなりにオーバーヘッドとなる
同じコンパイル単位であれば
今のコンパイラではそれほど差は出ないが
組み込みのチープなコンパイラもまだまだ使われている

542:
20/01/22 19:06:41.58 RZgzSQWe.net
>>501
お前さんは LISP のマクロを知らないのか?

543:デフォルトの名無しさん
20/01/22 19:17:53.96 2biZgMt+.net



544:LISPの仕様がC++と何か関係ある?



545:デフォルトの名無しさん
20/01/22 20:23:02 OSofFadI.net
関数とマクロの違いがlispだとわかりやすいから。
わかってないやつをあぶりだすのにはちょうどいい。

546:デフォルトの名無しさん
20/01/22 20:38:48 F1N+c+gr.net
マクロアセンブラのマクロは強力

547:デフォルトの名無しさん
20/01/22 21:16:42.45 kHABv+Er.net
>>527
で?

548:デフォルトの名無しさん
20/01/22 22:55:42 PNeen3jP.net
LISPじゃー
LISPの場合はー

www

549:デフォルトの名無しさん
20/01/22 23:00:35 Ab6Q02+v.net
QZが現れると大抵話が脱線するから放置しとこう。

550:デフォルトの名無しさん
20/01/23 02:42:18 96Ez/jHv.net
>>518
よくわかんないので、SFINAEなりConceptなりconstexprなりをデバッグに配慮して設計していたら
どう問題を改善できていたと思うのか、教えて。

551:デフォルトの名無しさん
20/01/23 05:39:34 ZM0XhcNb.net
(CMakeスレがないっぽいので)
target_link_libraries(a.exe PRIVATE ${MPI_CXX_LIBRARIES})
↑${MPI_CXX_LIBRARIES}が定義されていなくても合法で、その場合何ともリンクしないということを期待してもOK?
それとも
if(MPI_FOUND) target_link_libraries(...) endif()
とすべき?
公式を見てもよく分からない

552:デフォルトの名無しさん
20/01/23 07:08:06 Y+bt1zIi.net
>>535
こちらでどうぞ
スレリンク(tech板)

553:デフォルトの名無しさん
20/01/23 09:24:40 cHzm9I9L.net
>>534
デバッグに配慮してたらそんな糞機能入れないだろうね。

554:デフォルトの名無しさん
20/01/23 10:15:54 77XEoAHk.net
今日もgotoを使ってしまった・・・

555:デフォルトの名無しさん
20/01/23 10:22:15.42 KV664nBl.net
>>534
まず現在の問題の構造を考えて欲しい
c++はtemplateを使ってメタプログラミングを行うのはご存知の通り
でtemplateはチューリング完全だ
それだけの複雑さを持っている
それに対して一般人がやるデバッグはコンパイルが通って期待通り動くかエラーメッセージを見るかぐらいだろ?
これは原始的なprintfデバッグを行っているのと同じレベル
なのでまずストレートに考えると
メタプログラミングの結果が取得できること
コンパイラにデバッガ接続可能にしてメタプログラミングの実行がトレースできること
が必要
これがベストなのかはさておき、メタでないプログラミングでは当たり前なんだから
SFINAEをどうするかみたいな話の前にまずこういうところを整備すべきだった
ハードウェア依存じゃないのだから標準モデルを定めるのは可能だ

556:デフォルトの名無しさん
20/01/23 10:45:58 77XEoAHk.net
gotoを受け入れるとクリーンでわかりやすい実装が開ける。
・・・かもしれない。

557:デフォルトの名無しさん
20/01/23 10:47:36 96Ez/jHv.net
>>539
> メタプログラミングの結果が取得できること
> コンパイラにデバッガ接続可能にしてメタプログラミングの実行がトレースできること
> が必要

あったらいいなとは思うけど、必要(=可能になるまで機能を使わせるべきではない)とは思わないなぁ。

実行時プログラムについて言語規格側でデバッグのための特別な「標準モデル」が定められたりいてないけど、
現状でわりと使えるデバッガができてるし、コンパイラはあるけどデバッガは無いという環境や時代はあったし。

メタプログラミングだからといって機能追加に先立って特別な定めが要るという理屈はよくわからない。

558:デフォルトの名無しさん
20/01/23 11:24:46 Y+bt1zIi.net
>>540
470, 472も言っているが
gotoを使わないこと自体が目的化してはいけない
そういうアホがbreakは平気で使ったりする

559:デフォルトの名無しさん
20/01/23 11:27:54 y5HKK+ir.net
constexpr関数内でgoto使えないのだから、gotoを避けることを目的とせざるを得ない場面はある。

560:デフォルトの名無しさん
20/01/23 11:28:08 77XEoAHk.net
breakとgotoを同一視するのも問題なのでは。

561:デフォルトの名無しさん
20/01/23 11:28:57 Y+bt1zIi.net
>>544
同一視ってGOTO有害説の中では完全に同じだよ

562:デフォルトの名無しさん
20/01/23 11:31:15 y5HKK+ir.net
goto有害説ではbreakとgotoは違うもの扱いしているよ
breakで出来ないことがgotoで出来ること自体を問題視しているのだから

563:デフォルトの名無しさん
20/01/23 11:31:46 77XEoAHk.net
誰かそんな説を唱えたのでしょうか。

564:デフォルトの名無しさん
20/01/23 11:32:55 77XEoAHk.net
責任者出て来ーーい!!!

565:デフォルトの名無しさん
20/01/23 11:33:01 Y+bt1zIi.net
>>546
ほう、どう違う扱いをしているんだ?

566:デフォルトの名無しさん
20/01/23 11:34:43 y5HKK+ir.net
gotoは使わないけどbreakは使うってのがgoto有害説じゃないの?
完全に別の扱いしているってことだろ

567:デフォルトの名無しさん
20/01/23 11:35:44.43 77XEoAHk.net
ぐ、ぐ、ぐぅの音も出ない。

568:デフォルトの名無しさん
20/01/23 11:42:15.74 Y+bt1zIi.net
>>550
全然違う
まだ答えは書いてやらんぞ

569:デフォルトの名無しさん
20/01/23 12:29:41 nmx8CMX3.net
>>546>>539 も同じタイプの馬鹿
選択の幅は広い方がいい
機能の存在を否定するのではなく、単にお前が使わなければいいだけ

570:デフォルトの名無しさん
20/01/23 13:56:33 VWfJLmDE.net
>>533
+1
ほんそれ

571:はちみつ餃子 ◆8X2XSCHEME
20/01/23 14:47:05 QRqIx1i6.net
break でも goto でもそれを使わなかったときにもっと複雑になるのなら使っていいよ。
クソみてぇなフラグを立ててループから抜けるよりは break の方がマシだろ?
使わなくても十分に良いなら使わない方がいいに決まってるけど、要るときに使わないのは馬鹿げた話。
現実にはクソな道具が役に立つクソな状況があるんだよ。

572:デフォルトの名無しさん
20/01/23 15:47:36 tCbubFOj.net
do{...}while(0);
とかにしたくないとき

while(1){
...;
...;
break;
}
もたまに意図的に使う

573:デフォルトの名無しさん
20/01/23 16:22:12 77XEoAHk.net
なにこれ悪行自慢。

574:デフォルトの名無しさん
20/01/23 16:34:07 Y+bt1zIi.net
>>556
breakしなかった場合の動作が違うじゃねえかよ

575:デフォルトの名無しさん
20/01/23 16:47:49 nmx8CMX3.net
>>556
switch(1){
default:

}

576:デフォルトの名無しさん
20/01/23 16:49:27 77XEoAHk.net
通報しました。

577:デフォルトの名無しさん
20/01/23 17:36:57 y5HKK+ir.net
forやwhileもgotoのシンタックスシュガーだから使うなみたいな

578:デフォルトの名無しさん
20/01/23 17:43:18 y5HKK+ir.net
gotoって自由すぎて対応するlabelの場所によって意味が変わるから、自由に飛びたいとき以外に使うと分かりづらくなる。
breakやcontinueなら一連の処理の一部を飛ばすって意図がそれだけでわかるのだから、do{}while(0)だとgoto使うのと何を分かりやすくするかでトレードオフになる

579:デフォルトの名無しさん
20/01/23 17:47:15.54 Y+bt1zIi.net
do{} から以後が、それまでの話と繋がってねえぞ
それから break と continue のGOTO有害説における違いもわかってねえな

580:デフォルトの名無しさん
20/01/23 17:51:51 y5HKK+ir.net
do while(0)+breakを使う->loopだと誤解する可能性がある
gotoを使う->labelの飛び先見ないと意図がわからない

ってどちらの分かりづらさを大きな問題とするかで、どちらが良いかの好みが別れる
これがトレードオフ

581:デフォルトの名無しさん
20/01/23 17:53:42 y5HKK+ir.net
まあdo while(0)と組み合わせるならcontinueの方が良い気もする

やっぱりretryしようと思ったときのために

582:デフォルトの名無しさん
20/01/23 18:00:56 AdSJ3UeH.net
>>562
C++自体自由過ぎるから使わない方が良いぞ

583:デフォルトの名無しさん
20/01/23 18:04:36 y5HKK+ir.net
自由だから使い所はその自由度が必要なときってだけなのだが。
forのかわりにgotoでループさせる奴は正気じゃない

584:デフォルトの名無しさん
20/01/23 18:12:02.33 AdSJ3UeH.net
関数もどこに飛ぶかわからないから
使いどころは必要な時だけだな
ポインタも同じ

585:デフォルトの名無しさん
20/01/23 18:52:22.63 77XEoAHk.net
関数はgotoと同じ。

586:デフォルトの名無しさん
20/01/23 19:01:50.07 77XEoAHk.net
>>566
やはりこれからはRustですか。

587:デフォルトの名無しさん
20/01/23 19:09:24.45 nmx8CMX3.net
>>570
そうだよ
さようなら

588:デフォルトの名無しさん
20/01/23 19:19:26.28 5iKgMbK4.net
>>588
後者のbreakはifが付いてないので絶対breakするというなら一緒だが
しかし途中のどこかでcontinueが掛かれていると動作が変わる

589:デフォルトの名無しさん
20/01/23 19:21:21.59 5iKgMbK4.net
なぜか変なところへ安価が・・・
>>558
後者のbreakはifが付いてないので絶対breakするというなら一緒だが
しかし途中のどこかでcontinueが掛かれていると動作が変わる

590:デフォルトの名無しさん
20/01/23 19:22:06.67 77XEoAHk.net
goto駆使してcoroutineというパターンは。

591:デフォルトの名無しさん
20/01/23 19:22:49.44 nmx8CMX3.net
ループする気がないのにcontinueが入る可能性があるのか?
やっぱループ構文をループ以外の目的で使う奴はアホだわ

592:デフォルトの名無しさん
20/01/23 19:23:30.77 5iKgMbK4.net
>>564
どうでもいいが
do{}while(0);+continue;でもっと難読化するかも知れない

593:デフォルトの名無しさん
20/01/23 19:27:33.29 77XEoAHk.net
>>552が答えを書かないのだが。
もしかして答えなんて持っていないのでは。

594:デフォルトの名無しさん
20/01/23 19:32:56.95 rYLpH2kU.net
function();
何をするかわからないから関数は使うべきじゃない
pointer;
何を指し示すかわからないからポインタは使うべきじゃない

595:デフォルトの名無しさん
20/01/23 19:36:22.66 5iKgMbK4.net
>>565 に聴いてくれ

596:デフォルトの名無しさん
20/01/23 20:36:00 Y+bt1zIi.net
>>577
あとで、しまったと思ったんだが
もう答えを書いてしまっていた

今んとこ、まだ伏せておきたいので
どこなのかは書かないから
自分で探せ

597:デフォルトの名無しさん
20/01/23 22:32:03.65 bkVRGJlU.net
>>553
とかいいつつ古い仕様の範囲で実用してる人をバカにして
マウント取って憂さ晴らしするんですねわかります

598:デフォルトの名無しさん
20/01/23 22:33:01.52 glYn/cGw.net
つまりCPUはgotoの嵐だからクソと

599:デフォルトの名無しさん
20/01/23 22:54:05.78 nX/KPrtD.net
>>564
どうせdo-whileなんて本来のループとして使うことはまずないんだから、あとは
ローカルルールとしてwhile(0)以外禁止とかにすれば十分かと。

600:デフォルトの名無しさん
20/01/23 23:13:19.41 HgduJel4.net
gotoは高級の中にいきなり低級なことぶちこむから違和感あるんだろ
場当たり的で美しくないね

601:デフォルトの名無しさん
20/01/23 23:28:17.91 2vcw1hg/.net
まえにSQLパーサを書いたときはgotoがすごく便利だった。
文法をそのままソースに反映できる感じ。
goto嫌いな人たちはどうやって書くのか見てみたい。

602:デフォルトの名無しさん
20/01/23 23:35:42.82 M8BvdbFC.net
そういえば、まだ構造化されてない昔のBASICは、構造化された今のBASICより人気があったのではないかと思うけど、行番号と goto 文の組み合わせはラベル名を考えなくて済むので便利であった。
そして、BASIC言語は分かり易くて易しい言語と言われていたのだから、goto文自体はそんなに理解や扱いが難しいものではない。
ただし、フローチャートを書いてから組まないと分かりにくいことがあったかも知れない。
逆に、今フローチャートを書く必要がある場面は少なくなったのはgoto分を使わずに書けるようになったからかも知れない。

603:デフォルトの名無しさん
20/01/23 23:41:23.96 cHzm9I9L.net
ここまで無理やりな擁護してまで使うほどの機能じゃねーだろバカか。

604:デフォルトの名無しさん
20/01/23 23:43:47.47 LWLbtpQ/.net
gotoとかマクロとか話題に加齢臭漂ってるぞ
もうちょっと食いつく話題選べよ

605:デフォルトの名無しさん
20/01/24 00:03:07.60 M35o3kEk.net
>>585
普通にテーブル駆動では。

606:デフォルトの名無しさん
20/01/24 01:08:48.99 nZbbrzXe.net
ma


607:in関数が呼び出される前にグローバル変数が初期化されますが、 これの初期化順を変更することは可能なのでしょうか?



608:デフォルトの名無しさん
20/01/24 01:09:21.02 /4mdgZLq.net
A、B、Cと言う順序で実行されるべき処理が
A、B、Cと言う順序で実行されれば良いのであって
それが上からA、B、Cの順で書いてあろうが
B, A, Cと書いてあるのをgotoでA、B、Cの実行順にしようが
スレッド1、2、3が同期をとりあってそれぞれA、B、Cの順で実行しようが
相違なるコールバック1、2、3がこの順で呼ばれるように仕組まれた上でそれぞれA、B、Cを実行しようが
B、Cの実行がラムダ式で書かれていてその定義がAより上にあってAの実行後に呼び出されようが
ぜんぜん問題ではない

609:デフォルトの名無しさん
20/01/24 01:10:48.48 /4mdgZLq.net
一方gotoなど使わなくとももっと酷い糞はいくらでも作れるのだから
gotoが駄目だと言い張る奴は精神が弱って
いるな!

610:デフォルトの名無しさん
20/01/24 01:12:30.02 f1L6KzBl.net
いや普通にA,B,Cの順で書けよ。

611:デフォルトの名無しさん
20/01/24 01:15:32.35 eYFKJ4zI.net
>>590
同じ翻訳単位にあれば上から
異なる翻訳単位のグローバル変数の初期化順序は未定義

612:デフォルトの名無しさん
20/01/24 06:17:01 z1Jr3gge.net
>>590
やり方としては >>594 のとおり。
「同じ翻訳単位」とは要するに1個のソースファイルってことね。

でも一般的には「グローバル変数の初期化順序に依存すべきではない」
はずだけど、初期化順序を制御したい事情に興味があるわ。
もっと一般的には「グローバル変数を使うべきでない」だけど、それは別のお話。

613:デフォルトの名無しさん
20/01/24 06:24:04 3pA3r7pN.net
初期化順序を制御したい事情なんていくらでもあるだろ

そういう事情があるにも関わらず
明示的な初期化処理で初期化しないのが問題なのであって

614:デフォルトの名無しさん
20/01/24 07:10:40 O5UIpEDM.net
>>585
SQLってBNFで書けるから普通にswitchで書けると思うけど

615:デフォルトの名無しさん
20/01/24 07:19:43 3pA3r7pN.net
書ける書けないと
適する適さない
は別

616:585
20/01/24 07:49:27 1D9sTu/S.net
>>589
ツール使ってテーブルを生成させるならありだと思う。
そうでないなら、文法拡張のためにテーブルに手を入れるとか考えるだけでも嫌にならない?
あと、メンテナ交代のためにつくるドキュメントとかも。
>>598
それな

617:デフォルトの名無しさん
20/01/24 10:04:25 M35o3kEk.net
コンパイル時生成では普通。

618:デフォルトの名無しさん
20/01/24 12:24:16 O5UIpEDM.net
>>598
いや、わざわざgotoなんて使う必要ないって話な
C言語の時はエラー処理でgoto使う機会もあったけどC++なら例外で対処できるし
パーサーとか書いたことないとわからんかも知れんが

619:デフォルトの名無しさん
20/01/24 12:25:13 O5UIpEDM.net
>>599
ツール使うならコードまで生成させるだろ

620:デフォルトの名無しさん
20/01/24 12:33:56 pOzkcTtY.net
breakやらgotoやら、普通に関数作ってreturnすらば済む話なのになんでここまで盛り上がるかねぇ

621:デフォルトの名無しさん
20/01/24 12:38:12 nymKNYgW.net
>>601
わざわざgotoってのが意味不明
使用リソースや所要時間は非常に少ない
ただのジャンプ命令だから

少なくとも
わざわざ関数に分けるとか
わざわざ変数を使うとか
に比べればはるかに軽い

breakに比べれば
記述量が多いので
「わざわざ」という表現を使うことはあるだろう

622:デフォルトの名無しさん
20/01/24 12:42:44 pOzkcTtY.net
>>604
そんなエラーをgoto文で書いてる様なc++ソース読むのやだわw

623:デフォルトの名無しさん
20/01/24 12:47:41 nymKNYgW.net
無能自慢か

624:デフォルトの名無しさん
20/01/24 12:48:34 j8mERSyw.net
throwと同様の構文でgotoと同じコード生成する機能があれば良いのに

625:デフォルトの名無しさん
20/01/24 13:03:30 O5UIpEDM.net
>>604
タイプ量が少ないソースがいいソースとか思ってそうw

いつの時代の人なんだよ

626:デフォルトの名無しさん
20/01/24 13:43:32.45 Jh2W8wsF.net
わざわざ例外使わんでもgotoで十分なときも普通にある
gotoだから絶対ダメとか思ってそう
頭かたすぎ

627:デフォルトの名無しさん
20/01/24 13:59:14 M35o3kEk.net
法律で禁止するべきだな。

628:デフォルトの名無しさん
20/01/24 14:45:38 xfkHfIRp.net
>>603
ループの途中での return か?

629:デフォルトの名無しさん
20/01/24 16:31:56.03 NCsnJFfw.net
>>609
逆にわざわざgoto使う例外って何よ?
そんな個別情報も渡せない上にわざわざラベル名前まで考えて、goto文使う方がめんどくさいだろ
あーあれか、throwよりgotoの方が打つ文字少ないから楽とかかw

630:デフォルトの名無しさん
20/01/24 16:34:37.54 xfkHfIRp.net
throw って、入れる catch を RTTI を使って探すという
結構なコストのかかることをするが goto や longjmp にはそれがない

631:デフォルトの名無しさん
20/01/24 16:36:03.61 M35o3kEk.net
情報処理の教育を受けていると、大抵のものはステートマシンに見えるので、goto使いたくなるのかもしれない。
教育の有無で思考過程が違うので、使い道が理解できない人は使うことを禁じたほうが良い。
セキュリティにもかかわるので公安委員会直轄でgoto免許試験場を創設するべき。

632:デフォルトの名無しさん
20/01/24 16:58:54 Jh2W8wsF.net
>>612
情弱かよw
「c++ goto 例外」でググれば検索結果の最初のほうだけでもこんなに出てくる

URLリンク(tomeapp.jp)
URLリンク(www.thinkridge.com)
URLリンク(marycore.jp)
URLリンク(qiita.com)
URLリンク(www.nurs.or.jp)

633:デフォルトの名無しさん
20/01/24 17:00:51 M35o3kEk.net
>>615
一番上のリンクだけ見ましたが、これはミスリードじゃないだろか。

634:デフォルトの名無しさん
20/01/24 17:06:28 M35o3kEk.net
>>616
二番目のリンクも見ましたが、これはgoto代わりに例外を使うべきではないというお話ですよね。
例外の代わりにgoto使えという話ではないと思うんですよ。
「あれ?ifの代わりに例外使えるんじゃね?」とはならない。
同様に「あれ?gotoの代わりに例外使えるんじゃね?」ともなりません。

635:デフォルトの名無しさん
20/01/24 17:08:06 M35o3kEk.net
どれもしょぼいな。
本物のgoto使いはラベルを100個使うんですよ。

636:デフォルトの名無しさん
20/01/24 17:08:25 xfkHfIRp.net
C++歴20年でこれか。。。例外が悲しいほどわかってない

637:デフォルトの名無しさん
20/01/24 17:08:51 M35o3kEk.net
あーお前らなっちゃいねえ。
gotoの使い方わかっちゃいねえ。

638:デフォルトの名無しさん
20/01/24 17:10:14 M35o3kEk.net
gotoも例外も恐れなく使えと私は言いたい。
ただし、資格は必要でしょう。

639:デフォルトの名無しさん
20/01/24 17:11:56 KQhZ94n9.net
以下は 良い goto 文の使い方だと聞いたことがある。
・二重以上のブロックを抜けるために goto 文を使うこと。
・エラー処理。 <--- こう言われていたのは throw がなかった時代からだが、
          今でも throw, catch を使うより効率が良いので使っても良い
          と思われる。

640:デフォルトの名無しさん
20/01/24 17:14:59 M35o3kEk.net
>>622
はいはい、そういう人には、状態遷移図を書く癖をつけることをお勧めしていますよ。

641:デフォルトの名無しさん
20/01/24 17:31:23.24 pLepfJlB.net
ラムダ万能説
>>615 の1つ目の2など途中で打ち切りたいときはラムダさえあればgotoも例外もいらないことがわかる
if( [?]{
...
if(//エラー発生時){
return false;
}
...
return true;
}()
&&
...
&& [?]{
...
if(//エラー発生時){
return false;
}
...
return true;
}() ){
//正常終了
}
else{
//異常終了
}

642:デフォルトの名無しさん
20/01/24 17:33:42.84 pLepfJlB.net
[?]は[&]だ
なんか間違えた

643:デフォルトの名無しさん
20/01/24 17:42:43 NCsnJFfw.net
>>613
だから例外処理にまで速度にこだわる意味は何だよ
if文と勘違いしてんじゃね
そんな特殊な状況を一般化するんじゃねぇよ

644:デフォルトの名無しさん
20/01/24 17:54:06 M35o3kEk.net
ifより例外のほうが速いよ。

645:デフォルトの名無しさん
20/01/24 17:58:29 xfkHfIRp.net
if goto
if throw
となるわけでifと例外を比べるのはおかしい

>>626
「こだわる」とか「特殊」とかバイアス満載で話にならんな

646:デフォルトの名無しさん
20/01/24 18:07:28.38 xfkHfIRp.net
そもそも有名どころのコンパイラがだいたい例外禁止オプション持ってるのがどういう意味か考えてみろよ

647:デフォルトの名無しさん
20/01/24 18:18:37.93 TKM+8NJM.net
goto使わないで2重ループを抜けるのってどうするの?

648:デフォルトの名無しさん
20/01/24 18:20:42.85 j8mERSyw.net
>>628
throwが速いのは呼び出した関数がthrowする場合と戻り値で成否を返す場合の呼び出し元コード側の話だろ
余分な条件分岐命令が出力されない
代わりに例外発生時にスタック解析して例外処理用コード探すから物凄い時間がかかるが

649:デフォルトの名無しさん
20/01/24 18:24:28.47 D9pKpEah.net
goto 賛成派の意見
「例外使え」←「ネストが増えるから嫌」
「break使え」←「深い所から出るのに無駄なフラグ増やしたくない」

650:デフォルトの名無しさん
20/01/24 18:31:46 xfkHfIRp.net
ちげーよ
「例外使え」←言われなくても使ってるよ、gotoを禁止する理由になってねえ

651:デフォルトの名無しさん
20/01/24 18:33:01 3pA3r7pN.net
goto禁止派はgotoの使い方を知らないだけ
知ってたら禁止しない

652:デフォルトの名無しさん
20/01/24 18:34:35 Ua1W7Zv2.net
gotoと例外のどちらかを禁止するなら例外を禁止したい

653:デフォルトの名無しさん
20/01/24 18:37:16 3pA3r7pN.net
Windowsの64bit環境って例外めちゃくちゃ遅いんだよね
例外が発生しない時はオーバーヘッド無いんだけど

32bitだと関数コールの度にオーバーヘッドが発生する
だから例外処理OFF機能がある

654:デフォルトの名無しさん
20/01/24 18:37:19 xfkHfIRp.net
確かに現状のC++例外はちょっと好かんところがある
いっそnested_exceptionとdynamic_castだけに統一したらどうだと思ったりする

655:デフォルトの名無しさん
20/01/24 18:51:37 M35o3kEk.net
おまえら全員間違ってる。
gotoは免許制にするべきで、一律に禁止するものでも許可するものでもない。
試験に合格した者だけ使うべき。

656:デフォルトの名無しさん
20/01/24 18:53:22 M35o3kEk.net
switchより例外のほうが速いよ。

657:デフォルトの名無しさん
20/01/24 19:29:40 3pA3r7pN.net
例外はめちゃくちゃ遅い

658:デフォルトの名無しさん
20/01/24 19:31:01 M35o3kEk.net
それは機密だと言っただろうが。

659:デフォルトの名無しさん
20/01/24 20:19:58.69 M35o3kEk.net
「もういいよ。オレがインデックス張ってやるから、まあ見てから言えよ。な?」

660:デフォルトの名無しさん
20/01/24 20:28:57 f1L6KzBl.net
まだしょうもないこと言い続けてんのかよ。
こういう糞議論を排除するってだけでもgotoを禁止する価値はあるな。

661:デフォルトの名無しさん
20/01/24 20:31:46 M35o3kEk.net
goto使いたいものが100万人いれば、更新費用1万円として100億になる。
gotoで事故を起こした場合、行政処分がある。
取り締まるためにgoto警察も必要。

662:デフォルトの名無しさん
20/01/24 20:32:37 xfkHfIRp.net
gotoじゃなくおまえらを排除すれば
問題の本質がわからんやつによる不毛な喧嘩≠議論はなくなる

化学調味料の永久ループと寸分違わねえ

663:デフォルトの名無しさん
20/01/24 20:33:06 Ua1W7Zv2.net
例外免許とテンプレート免許と多重継承免許も必要

664:デフォルトの名無しさん
20/01/24 20:51:07 K3PUU+GG.net
なんでプログラマってこんな糞みたいな話題で延々と盛り上がるんだろうね
って、実は知ってるくせにってか

665:デフォルトの名無しさん
20/01/24 21:08:30 O5UIpEDM.net
>>614
ステートマシンでgotoって次のステートに直接飛ぶとか言ってるのか?

666:デフォルトの名無しさん
20/01/24 21:10:07 xfkHfIRp.net
FSMとデータパスか、懐かしい。。。

667:デフォルトの名無しさん
20/01/24 22:22:30.15 SKKziN9N.net
ダイクストラの時代にとっくに決着した話をまだダラダラやってんのか

668:デフォルトの名無しさん
20/01/25 00:30:42.18 sCkCqRFa.net
煽り9割マジ1割
ここはそうゆうインターネットです

669:デフォルトの名無しさん
20/01/25 10:54:40 cxLY0DeL.net
大型goto免許必須なので。

670:デフォルトの名無しさん
20/01/25 12:01:20.82 Fgzm1LAC.net
大型二種持ってるから大丈夫

671:デフォルトの名無しさん
20/01/25 12:02:23.88 Fgzm1LAC.net
クラスもポインタも免許制にしよう

672:デフォルトの名無しさん
20/01/25 12:04:00.88 HbHTz3pb.net
絶対禁止と思っているやつは全員不合格
つーより事前審査で門前払い

673:デフォルトの名無しさん
20/01/25 12:08:19.96 Fgzm1LAC.net
絶対禁止と本気で思ってるヤツはいないだろ
gotoが無ければ2重ループも抜けられない

674:デフォルトの名無しさん
20/01/25 12:11:48.46 gDStPvND.net
gotoおじさん達いい加減にこの話終わりにしてくれない?
久しぶりに自分が参加できる話題だからってはりきりすぎでしょ

675:デフォルトの名無しさん
20/01/25 12:1


676:2:11.62 ID:xcQv9a+F.net



677:デフォルトの名無しさん
20/01/25 12:28:41 bvJDNhpJ.net
>>657
今は他に話題ないし
話題がないと数日レス止まるようなスレじゃけえ

678:デフォルトの名無しさん
20/01/25 12:30:46 Fgzm1LAC.net
じゃ次は生ポについて

679:デフォルトの名無しさん
20/01/25 12:38:02 cxLY0DeL.net
哲学的問題だから、森村進の意見も聞くべき。

680:デフォルトの名無しさん
20/01/25 13:18:54 oEqdrxlM.net
>>659
話題
URLリンク(www4.nhk.or.jp)

681:デフォルトの名無しさん
20/01/25 13:54:31 cxLY0DeL.net
宣伝乙。
NHKが来たぞーにげろー。

682:デフォルトの名無しさん
20/01/25 13:55:49 FepESkjd.net
江添亮の本でstd::cout<<""にs付けろって書いてたんだけどsつけたらエラーになる

683:デフォルトの名無しさん
20/01/25 13:59:45 HbHTz3pb.net
>>657
久しぶりに笑う健康法ができてありがたかったんだよ

おーい芸人さんたち、アンコール! アンコール!

684:デフォルトの名無しさん
20/01/25 14:01:45 HjVTkheD.net
>>664
#include <string>
using namespace std::literals::string_literals;

685:デフォルトの名無しさん
20/01/25 14:25:20.83 cxLY0DeL.net
とまあこのように、江添先生の本は、すべて理解してる人にしか理解できません。

686:デフォルトの名無しさん
20/01/25 14:32:55.37 HbHTz3pb.net
幼稚園児が大学の図書館へ行っても読める本ないのと同じだな
無理しないで「ぐりとぐら」くらいから始めとけ

687:デフォルトの名無しさん
20/01/25 14:53:05.04 cxLY0DeL.net
はい、江添釣れたー。

688:デフォルトの名無しさん
20/01/25 14:56:16.54 HbHTz3pb.net
残念、俺は江添じゃない
興味のツボは奴と似てるとこあるけどね

689:デフォルトの名無しさん
20/01/25 15:45:58 136JVXqR.net
>>666
そんなこと書いてなかった

690:はちみつ餃子
20/01/25 15:52:56.31 NV/40SqZ.net
普通の文字列リテラルが char 型の配列であるというのは (初心者には) 分かり難いので、
いっそ一貫して std::string 型で扱うというのは悪くない方針だと思う。
だけどユーザー定義リテラルという枠組みもそれはそれでだいぶんアレな仕様なんで、どちらにしてもクソだよな。

691:デフォルトの名無しさん
20/01/25 16:06:56 bbXnDJeu.net
こんばんは、後藤です。
ところで ""s だけでは片手落ちな気がする
ちゃんと u""s みたいに文字コード指定しなかったら
string_literalsを使う意味ないような気がするんだけど
わしだけか

692:デフォルトの名無しさん
20/01/25 16:09:53 lY+ErK7r.net
>>656
関数で切り出してreturnしろカスが。

693:デフォルトの名無しさん
20/01/25 16:11:03 gDStPvND.net
uがなかった時代でもなんとかなってたんだから意味なくはないだろ

694:デフォルトの名無しさん
20/01/25 16:30:12.05 HjVTkheD.net
江添本は初心者向けと謳っていながらこのくらいわからん奴は帰れみたいな意思を感じる

695:デフォルトの名無しさん
20/01/25 16:50:56.75 lY+ErK7r.net
初心者に内容を理解してほしいんじゃなくて俺すげーってことだけ理解しろってスタンスだからな。
むしろ理解されると大したことやってないのがバレると思ってるくらいだろ。

696:デフォルトの名無しさん
20/01/25 16:53:23.32 XvrYCXmQ.net
C++はしたことがないが数学博士号のやつと高校卒業を一緒くたにするのが問題だろう
それぞれの学力で開始すべき章を設定するべきだ
できないとしたら著者の無能なので落胆することはない

697:デフォルトの名無しさん
20/01/25 16:58:57.12 cxLY0DeL.net
初心者がC++に入り込まないよう防御壁として江添先生が存在するのではないか。

698:デフォルトの名無しさん
20/01/25 17:03:37.43 cxLY0DeL.net
C++の道を行きたいなら、俺を倒


699:してから行け。 ってことでは。



700:デフォルトの名無しさん
20/01/25 17:15:21.67 lY+ErK7r.net
張り合ったら明らかにプログラム書けなくなるだろ。。誤誘導すぎるわ。

701:デフォルトの名無しさん
20/01/25 17:27:59.47 cxLY0DeL.net
C++の前に立ちはだかる屈強な門番。
俺を倒せるものでなければ入門を認めぬ。

702:はちみつ餃子
20/01/25 18:19:41.41 NV/40SqZ.net
グダグダな C++ をグダグダじゃなく説明するのは無理だろ。
どの本を見たって少なからずグダグダか物足りないかどっちか。

703:デフォルトの名無しさん
20/01/25 18:23:50.63 qDxhJtbw.net
まぁ、実際の現場だと、c++なんてちょっと便利なC言語としてしか使われてないよ
未だにcharポインタやmalloc乱立してるし参照型すら使われてない。
クラスなんて関数まとめるnamespace代わりだし

704:はちみつ餃子
20/01/25 18:25:32.23 NV/40SqZ.net
ひと昔前にstaticおじさんの話がバズったことあるけど、
たぶん現実にはけっこういるんだろうな。

705:デフォルトの名無しさん
20/01/25 18:26:39.08 mY899MyV.net
>>684
そんな現場もあるんだなw

706:デフォルトの名無しさん
20/01/25 18:32:00.68 4TCxFoUN.net
ちゅうか、C++ 使うなら charポインタは必須だ。
使いたくないなら 別の言語を使ったほうがいい。

707:デフォルトの名無しさん
20/01/25 18:43:08.64 HjVTkheD.net
Cのライブラリを使わない限り文字情報はすべてstringで済む
モダンC++の仕様はそういう範囲内での使用も許容している

708:デフォルトの名無しさん
20/01/25 18:45:55.89 mY899MyV.net
c++ではchar*は文字列とは関係ない場面でよく使う

709:デフォルトの名無しさん
20/01/25 18:51:29.47 t8q8NVJB.net
>>684
>クラスなんて関数まとめるnamespace代わりだし
さすがにそれはダメだと思うが・・
そういう現場確かにあるが
>>688
とか言いながらstringは途中からnull終端を保証したりして、
結局Cの資産を無視できなかったという

710:デフォルトの名無しさん
20/01/25 18:53:42.93 mY899MyV.net
もともとc_strはnull終端されてた
それに合法的にnull文字を含むことが出来る時点でnull終端ではない

711:デフォルトの名無しさん
20/01/25 20:51:03 r+ZvoXtB.net
>>684
いくらなんでもレベル低すぎるぞ

712:◆QZaw55cn4c
20/01/25 20:55:09 0oKBD7Vk.net
>>684
私のことですね…
new をグローバルオーバーロードしたら、その中では malloc() するしかないですからね…

713:デフォルトの名無しさん
20/01/25 21:03:28 gDStPvND.net
>>693
> >>684
> 私のことですね…
> new をグローバルオーバーロードしたら、その中では malloc() するしかないですからね…

するしかない?
mallocはどうやって実装されてると思う?

714:デフォルトの名無しさん
20/01/25 21:16:51 HbHTz3pb.net
>>693
おまえさ、何のために new をグローバルオーバーロードしてるの?
malloc でいいんなら、そんな必要ねえだろ

おまえアホか

715:デフォルトの名無しさん
20/01/25 21:25:16 gDStPvND.net
まぁデバッグの手法としてなくはない
ただその手のものは既存のものが腐るほどあるからそれ使った方がいい

716:◆QZaw55cn4c
20/01/25 22:50:36 0oKBD7Vk.net
>>694
>するしかない?
ええ、するしかないと思いますよ

>>695
>何のために new をグローバルオーバーロードしてるの?
無論 delete と対になっているかどうかをチェックするためですよ、こういうのは自分では出来ていると思っていても時々お漏らししてしまいますからね
まあ、C++11 以降は手抜きして make_shared することを覚えてしまってずいぶんと時間が経ちましたが、それでも生ポを使うときは new/delete をオーバーロードしますね
スレリンク(tech板:51番) line.143~150

717:◆QZaw55cn4c
20/01/25 22:53:24 0oKBD7Vk.net
>>696
昔の borland c++ にはまさしくそのための、なんていうんだったんでしたっけ、そういうコンパイルスイッチがあって便利に使っていましたが、
今評価版を入手すると、それは clang ベースに変更されて、その機能がなくなってしまったんですよね…

718:◆QZaw55cn4c
20/01/25 23:01:38 0oKBD7Vk.net
>>698
思い出した、bcc32 CodeGuard でしたっけ

719:デフォルトの名無しさん
20/01/25 23:17:


720:56 ID:gDStPvND.net



721:はちみつ餃子 ◆8X2XSCHEME
20/01/25 23:24:58 NV/40SqZ.net
>>697
アプリケーションの層ではアロケータを書く機会はまずないから
やったことないのは別にいいけど、
さすがに new の本質はメモリの割り当てだってのはわかってて欲しいわ。

722:
20/01/25 23:28:27.92 0oKBD7Vk.net
>>700
>それなりにプログラマ経験あるんだと思ってたけどmallocの中身知らないとはね
専ら win32api でやっているので、::HeapAlloc(::GetProcessHeap(), ...) とか ::HeapFree(::GetProcessHeap(), ...) だとは考えていましたし、数年前はそう置き換えていたこともありました。
>unmapしてるところにアクセスしたらその時点で例外で止まるから原因特定が容易
これは初耳です。よろしければ、もう少しキーワードだけでいいので羅列していただけませんか

723:
20/01/25 23:33:20.09 0oKBD7Vk.net
>>701
それはおそらく大丈夫だと思います

724:デフォルトの名無しさん
20/01/25 23:36:38.54 nqs2x9Ls.net
関数で切り出すのは入出力がはっきりするというメリットはあるが
ループの内と外の依存性が高い場合に内を無理矢理関数分けすると
シグネチャに入力引数と出力引数(参照渡し)がぞろぞろ並ぶことになって
それはそれでお勧めしない
(関数の意味も不明確になりがちやし…

725:デフォルトの名無しさん
20/01/25 23:52:12 gDStPvND.net
>>702
そうだよwindowsならそのあたりだよ
あとVirtualAllocね

> >unmapしてるところにアクセスしたらその時点で例外で止まるから原因特定が容易
> これは初耳です。よろしければ、もう少しキーワードだけでいいので羅列していただけませんか

new/deleteのたびにページ単位で確保・解放するんだよ
それこそVirtualAllocで
だから重いよ
そうするとdangling pointerでヒープ壊される問題があった場合、
壊しにいったら即セグフォルで止まるからデバッガつなげれば犯人特定できる

726:デフォルトの名無しさん
20/01/26 00:43:59.41 F5s0MU2W.net
>>686
そんな職場は大変だぞ
構造体だからって、triviallycopyableを満たさないクラスをわざわざvoidポインタに格納して、memcpyしたり
クラスをわざわざmallocしてコンストラクタ、デストラクタ飛ばしたり
const属性をキャストでわざわざ消して値変えられたり

727:デフォルトの名無しさん
20/01/26 01:31:21 6ZE6/BGT.net
ベターCなどとほざく連中がいかに馬鹿で愚かで有害かがよくわかる

728:はちみつ餃子 ◆8X2XSCHEME
20/01/26 01:32:21 zFvDGbzt.net
まあそんなやつは C もまともに使えてなかったりするんだけどな。

729:デフォルトの名無しさん
20/01/26 01:44:39.85 hLglXOws.net
中途半端にc++を持ち込んで現場を荒らすやつもいるからね
>>706 の状況はそういうところで見たことある
別にc++が書けるのがえらいわけじゃない
質の良いプロダクトをきっちり仕上げられる奴がえらい
まわりがc++わからないメンバーならcで書くか、
c++が必要というなら十分にチームでトレーニング行ってからだ

730:はちみつ餃子
20/01/26 01:48:04.74 zFvDGbzt.net
C から段階的に学んでいける (業務を止めずに) って D&E には書いてあるけど、
今の C++ じゃもう無理だと思うわ。

731:はちみつ餃子
20/01/26 01:48:23.93 zFvDGbzt.net
C++ は C++ としてそこそこの訓練はいるよな。

732:デフォルトの名無しさん
20/01/26 02:05:13.00 Y1EGWiT/.net
はちみつ餃子がでてくる


733:と、どうもこんな時間に腹が減ってきていかん



734:はちみつ餃子
20/01/26 02:10:39.45 zFvDGbzt.net
食えばいいじゃん。

735:デフォルトの名無しさん
20/01/26 05:01:35 3a27Zr8u.net
>>674
gotoの使い方を知らないと大変だね

736:デフォルトの名無しさん
20/01/26 07:41:47 Yuet6lAk.net
>>683
禿4を少しは見習っていただきたい。

737:デフォルトの名無しさん
20/01/26 10:01:19.30 aNHbuwn9.net
>>706
それは問題。
でも、STLべったりのC++は Cとの書き方の乖離が激しすぎて、もはやCの冠を被ってほしくない。

738:デフォルトの名無しさん
20/01/26 10:06:55.53 BKKks8j/.net
>>714
関数切り出しできないと大変だね。(特に周りの人たちが。)

739:デフォルトの名無しさん
20/01/26 10:47:19 VrR0aqw1.net
>>716
CはCらしく、C++はC++らしく使えばよろしい
CをPascalっぽく使うやつとかすげー迷惑なのと同じ

740:デフォルトの名無しさん
20/01/26 10:53:32 1VU+FMua.net
>>716
えっ?

   C#

741:デフォルトの名無しさん
20/01/26 10:56:24 ZSyO84gV.net
テンプレートメタプログラミングはC++らしいとも思うけど全然別の言語になっている気がしないでもない

742:◆QZaw55cn4c
20/01/26 11:09:29 rQ+CcOdx.net
>>705
情報ありがとうございます
::VirtualAlloc() 系は書いてあることが難しい上に、ばっちゃの遺言「::HeapAlloc() を使え」もあって敬遠していましたが、ここで教えてもらったのもなにかの縁だからデバッグ用に試行してみようと思います

win32api の criticalsection と signal でやっていた(何かがまずくてstarvationに悩まされていました)のも
C++11 になって pthread が大幅に規格に取り込まれた以上、
C++11 の上からの mutex・cond 派に切り替えようか、とか、C++11 になってスタイル変更を考え中です

743:デフォルトの名無しさん
20/01/26 11:32:39 loc7kxiY.net
>>701
マウント失敗乙

744:デフォルトの名無しさん
20/01/26 11:33:18 3yHBwxN6.net
>>717
ループを抜ける為に関数を分けるようなアホと一緒に組むと大変だ

745:デフォルトの名無しさん
20/01/26 11:41:25 VrR0aqw1.net
確かに大変だね
if breakしてる複合文を関数にするときにreturnとか言い出すやつは
longjmpだろうがって

746:デフォルトの名無しさん
20/01/26 12:03:53.99 aNHbuwn9.net
>>720
実際、別言語だと思う。
C++はtemplateや演算子のオーバーライドを使えば、ほぼ別言語をみなせるようなものを上に載せられる設計になっているので。
STLを使いまくるプログラミングの書き方だと、もはやCとは何の関連性もなくなってしまっている。

747:デフォルトの名無しさん
20/01/26 12:09:22.76 BKKks8j/.net
>>723
ループ抜け出すぐらいでそんな苦労するようなコードになってるなら
関数で抜け出すのが当然だろカスが。
いくら脳みそ足らなくてもgoto擁護のために無理筋言ってるってことにそろそろ気づけ。

748:デフォルトの名無しさん
20/01/26 12:12:08.41 bvl7bZIP.net
どんな苦労?

749:デフォルトの名無しさん
20/01/26 12:13:10.43 Yuet6lAk.net
ネストするなら別のプログラムに切り分けましょう。
シェルから呼び出せばいいのです。

750:デフォルトの名無しさん
20/01/26 12:18:30.55 Scuijf7t.net
>>725
もともとCってマクロで何でもやりたい放題の言語だぞ
URLリンク(www.pro.or.jp)

751:デフォルトの名無しさん
20/01/26 12:39:03.45 aRFw4TjA.net
>>727
「gotoダメ!絶対!教」の戒律を破ることじゃないかな。きっと身を裂かれるほどの苦しみな


752:んだろうw



753:デフォルトの名無しさん
20/01/26 12:50:28.18 PjjUDKm0.net
いったん収まったと思ったら
また goto の話開始してて草
アスペ特融の拘りと言われても仕方がないな

754:デフォルトの名無しさん
20/01/26 13:01:54.18 Yuet6lAk.net
goto以外の話題を提供できないお前が悪い。

755:デフォルトの名無しさん
20/01/26 14:36:31.44 VrR0aqw1.net
gotoの話で叩きのめされたやつが話題を変えたいのはわかったよ(ニヤニヤ

756:デフォルトの名無しさん
20/01/26 17:07:41 aNHbuwn9.net
>>729
たしかにCもマクロを使えば結構何でも出来る。
だが、マクロを多用すると分かりにくくなるとも言われていたし、使い方によっては、ソースコードが全く別言語のようになってしまうことも知られていた。
それと同様の現象がSTLにおいては起きる事態になってしまっている。

757:デフォルトの名無しさん
20/01/26 17:09:16 jQnb27FW.net
もっとマクロをリッチにしてほしい

758:デフォルトの名無しさん
20/01/26 17:19:16 VrR0aqw1.net
>>734
なってねえよ
おまえさんにはSTLがIOCCCに見えるのか

慣れの問題と言いたいがおまえさんは極端すぎ
一種の病気だ

759:デフォルトの名無しさん
20/01/26 17:21:00 aNHbuwn9.net
>>736
STLの作者は、自分では分かり易くしようとしているようでいて実際には逆に分かりにくくしてしまっている。

760:デフォルトの名無しさん
20/01/26 17:22:57 Yuet6lAk.net
STLは神がかってるけどな。
あの時代によく設計できたな。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch