C++相談室 part147

■ このスレッドは過去ログ倉庫に格納されています
2019/12/18(水) 17:56:53.03ID:uFDqtnkl
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part146
https://mevius.5ch.net/test/read.cgi/tech/1573094136/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

↑え?だってお前、普通ダイナミックリンクするだろ?
"ダイナミックリンク"す・れ・ば、ファイルサイズ**増えないです**
2020/01/26(日) 22:55:11.25ID:hLglXOws
そうなんだよね
この仕様がどこで決められてるものかがよくわからない
ぐぐったら
ttps://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this
というのが見つかってなんか built-in overload らしいんだけど
結局のところ関数オブジェクトに対する仕様がどこに書かれているのかよくわからない
でもわりとよく使ってる
2020/01/26(日) 23:01:50.07ID:zFvDGbzt
>>791
・ キャプチャしている変数がないクロージャは関数ポインタに変換可能であり、関数ポインタが必要なところでは暗黙に型変換される
・ クロージャに単項 + を適用することはできない (ので関数ポインタに型変換してから解釈される)

という合わせ技によって関数ポインタになる。
(キャプチャしてる変数があるときは変換できないよ)
2020/01/26(日) 23:05:52.70ID:Pq6RurGB
関数オブジェクトには関数ポインタへの暗黙の変換が存在して
operator+(T*)がそれ自身を返すからということね
2020/01/26(日) 23:09:35.82ID:hLglXOws
まじで?
たまたまできるってことなのか
なんか今後使うのためらうわw
2020/01/26(日) 23:11:17.20ID:zFvDGbzt
>>795
専用の、クロージャをポインタに変換する機能というわけではないという意味ではたまたまだけど、
ちゃんと保証された動作なのでためらわなくていいと思うなぁ。
2020/01/26(日) 23:14:39.96ID:hLglXOws
>>796
もし今後関数オブジェクトに他の暗黙変換が追加されたらって考えると気が引ける
まぁ使うんだけどさ
2020/01/27(月) 00:17:47.09ID:uhXUQTHO
普通に型宣言すればいいだけだよねこれ。
2020/01/27(月) 00:18:13.23ID:8wq+eSeZ
>>776
実験してないので間違ってるかもしれないが、
(型名)ptr で関数ポインタへキャストする場合、
( int(*)(int) )ptr
と書いても良いが、
( int(int) )ptr
と書いても良かったかも知れない。というのは、
typedef int (*FUNC)(int);
と書いても良いし、
typedef int FUNC(int);
と書いてもよかったり、関数型のポインタ pFunc に対して、
(*pFunc)(123);
と書いても良いし、
pFunc(123);
と書いても良い、とか。
2020/01/27(月) 00:19:00.09ID:jlvCAhZE
>>776
C89 から関数型の表記としては解釈されるかと。
コンパイルが通る文脈は C++ まで無かったかもしれんけど。
C++ でも今のところ using とテンプレート引数以外では使えなさそう。
2020/01/27(月) 00:25:21.67ID:8wq+eSeZ
>>799
一部、コンパイラが故意にエラーにする可能性は有るが、
int(*ptr)(int);
は、関数へのポインタ型の変数ptrの宣言。
int(*)(int)
は「関数へのポインタ型」そのもの。
int func(int);
は、関数のプロトタイプ宣言だが、内部処理的には関数型の変数 func を定義しているような
解釈がされた後、関数型の場合の特別な処理として変数ではなくプロトタイプ宣言に特別
処理がされる。そして、
int(int)
は「関数型」そのもの、という解釈になる。
よく見るとこれらに対抗関係が有ることが分かる。
なお、最後のint(int)はコンパイラの内部処理的には関数型そのものだという解釈になるが、
コンパイラがその場合に特別にエラーを出す処理系と出さない処理系があるかもしれない。
2020/01/27(月) 00:26:31.36ID:8wq+eSeZ
>>801
対抗関係 ---> 対応関係
2020/01/27(月) 00:34:47.99ID:8wq+eSeZ
>>801
何が言いたかったというと、戻り値(引数型) を解釈する新しい仕様が追加された
というより、数学の数式のようにみたときに一貫した規則に従っていることが
わかるということ。言葉で言えば、
 「定義文に置いて、名前を除去すると型名になる」
という規則。
int func(int);
という定義文に置いて、名前であるのは func。だから、funcを除去した、
int(int)
は、funcの型名になる。名前funcの型は、「関数型」だから、これは関数型
という型名そのものとなる。
int a;
の場合、名前であるのは a で、aの型は、int型。だから、この定義文から
名前を除去した int は、int型ということになる。
int (*pFunc)(int);
の場合も、pFuncという変数の定義文であるが、この定義文における名前とは
pFuncであるので、pFuncを除去したところの
int (*)(int);
は、pFuncの型であるところの、「関数へのポインタ型」となる。

つまり、同じ法則にしたがっている。
2020/01/27(月) 00:36:25.26ID:e3ktUGSY
関数型が暗黙に関数ポインタ型に型変換されるルールで引っ掛かってるってことかな?
関数型そのものは C++ が出現した最初から存在すると思うよ。 C にもあるもの。

こういう特殊な変換ルールを強制するために std::decay がある。
805800
垢版 |
2020/01/27(月) 01:15:58.29ID:jlvCAhZE
>>776
typeid で使ってもコンパイル通った。
2020/01/27(月) 02:13:11.97ID:DIOsR0tc
RustってどれくらいC++に取って代わるんろうか
互換性以外でC++使う意味ない、みたいな時代はくる?
2020/01/27(月) 02:15:18.60ID:an2yFfMH
Rustの話はRustスレでやれ
布教すんな
2020/01/27(月) 06:56:19.70ID:EVyt1Wcb
>>783
スマートオブジェ
2020/01/27(月) 09:23:59.26ID:7jNlWdbx
C++のライブラリはC++からしか使えないから最高なんです
何故ならヘッダという古臭い仕組みを採用しているからww
なおCOMは
2020/01/27(月) 09:33:48.52ID:PH8qw3WE
>>798
そりゃauto使いたいからじゃない
その理屈ならそもそもlambda使わずに普通の関数書けばいいってなる
2020/01/27(月) 10:29:36.60ID:nw3WJhJD
>>783
[](int b) { return b;}; だけなら明らかにラムダ式の関数ポインタだけど
それをオーバーロードか何かの+で虚無と足し算してんの?

*[](int b) { return b;};
これは掛け算でもするの?
2020/01/27(月) 10:44:46.19ID:EVyt1Wcb
関数ポインタではない
スマートオブジェクトへのポインタだ
ただの関数ポインタならファンクタとして機能しない
2020/01/27(月) 10:54:24.33ID:j8/I9hQ5
>>811
単項演算子の+だろ
2020/01/27(月) 11:22:15.92ID:PH8qw3WE
>>811
はちさんが答え書いてるよ
>>793
2020/01/27(月) 15:33:55.69ID:LGsyX1lU
ラムダはデリゲートじゃねー。一個しか保持できんわな。
と遅レス。
2020/01/27(月) 15:47:35.27ID:uUAjQCPR
ステートレスラムダって用語が出てこないんだね
stateless lambda
2020/01/27(月) 15:57:13.10ID:uUAjQCPR
>>804
template <typename F>
void test(F&&) { cout << 1; }
void test(int(*)()) { cout << 2; }

int func() { return 0; }

int main()
{
test(func); //2
test([]{ return 0; }); //1
}

ステートレスラムダを関数ポインタに渡すのはconversionで
関数を関数ポインタに渡すときのlvalue translationとは違う
2020/01/27(月) 16:03:26.06ID:uUAjQCPR
lvalue transformationだ、これは失礼
2020/01/27(月) 16:10:02.82ID:e3ktUGSY
>>817
おっ。 そうなんや。
2020/01/27(月) 16:16:57.88ID:uUAjQCPR
g++だと、これ通るw
auto closure = []{ return 0; };
using funcp = int(*)();
test(closure.operator funcp());
2020/01/27(月) 16:29:40.06ID:Xjs2F3Iq
[]の後()不要だっけ?
2020/01/27(月) 16:30:47.83ID:an2yFfMH
引数がないなら省略可能
2020/01/27(月) 17:56:21.86ID:e3ktUGSY
>>814
ワイはどちらかというとはちみつより餃子の方にアイデンティティがあるので…・…
2020/01/27(月) 18:43:12.12ID:Be1ain3H
>>822
勉強になりました。
2020/01/27(月) 19:32:41.69ID:EVyt1Wcb
>>812
×スマートオブジェクトへのポインタだ
○スマートオブジェクトだ
2020/01/28(火) 09:26:07.54ID:ClFSc0Tc
しょうもないシンタックスシュガーの話が好きな奴多いね。
2020/01/28(火) 10:18:33.58ID:iJMYk+LH
gotoおじさんまた登場だよ
2020/01/28(火) 10:25:01.77ID:ciqR13vi
>>827
踊るポンポコリンの「インチキおじさん登場」を思い出した。あんまり間違ってないだろう。
2020/01/28(火) 10:44:40.68ID:wcDzWZFN
ボコられるの好きなんか? 変態めw
2020/01/28(火) 10:49:48.26ID:ivYV6JvB
物事は適切に伝えろ
それが出来ないなら口を開けるなカスども
2020/01/28(火) 10:52:11.84ID:ivYV6JvB
ラムダが関数ポインタとかほざいてるカスが居てびっくりしたわ
2020/01/28(火) 11:05:50.35ID:AXFiEKC0
>>831
インライン展開されるから?
2020/01/28(火) 11:12:08.47ID:tLdUC4IA
>>831
>>783 のこと?
834デフォルトの名無しさん
垢版 |
2020/01/28(火) 11:23:05.28ID:ijxMtirO
個人的にはテンプレートなのに糞のSTLよりも
マクロωのQtの方がうまくやれてる実用的だと思う
835デフォルトの名無しさん
垢版 |
2020/01/28(火) 11:24:46.27ID:ijxMtirO
>>758
typedefに夢観すぎ
2020/01/28(火) 11:30:08.83ID:jIEBko3c
まあ個人的な感想は個人的な感想だからなぁ。
俺は Qt に対してなんやこのクソはとしか思わんが、
広く使われている現実がある以上は実用性は高いんだろう。 たぶん。
2020/01/28(火) 11:38:43.71ID:9AkNqXrr
Qtのmocは何か嫌だ
2020/01/28(火) 11:45:43.67ID:wcDzWZFN
>>835
ああ、usingを使うべきだったな
typedefなんてダセーもんもういらねえって
頭ではわかってるんだが長年の癖でぽろっと出ちまう
839デフォルトの名無しさん
垢版 |
2020/01/28(火) 12:03:55.62ID:AXFiEKC0
マクロを名前空間に閉じ込められるようになれば、マクロの害悪の何割かは減らせるはず。
2020/01/28(火) 15:45:53.30ID:wcDzWZFN
ということは名前空間をプリプロセッサが処理せにゃあかんな
translation phaseを根本的にぶっ壊さないと無理だと思うが
2020/01/28(火) 16:34:43.00ID:ogCuVxV7
typedefが駄目で、usingが好まれる理由を教えてください。
842デフォルトの名無しさん
垢版 |
2020/01/28(火) 16:38:19.30ID:AXFiEKC0
否定的な視点から散々な言われ方をされがちなC/C++のマクロだけど、
Java/C#/Python/Pwel/Rubyに似たテキスト変換がないことに物足りなさを感じることが多いのも事実。
2020/01/28(火) 16:39:59.59ID:jIEBko3c
>>841

私が思いつくのは
・ using は名前を導入するという一巻した意味規則がわかりやすいから
・ using はテンプレートに出来るから
・ typedef だと複雑な型定義をするときに肝心の新しい名前が中の方にあって見づらい
844デフォルトの名無しさん
垢版 |
2020/01/28(火) 16:44:17.01ID:AXFiEKC0
typo。PwelじゃなくてPerl。Perlはめっきり影が薄くなった。
PerlはGit for Windowsにバンドルされているので世の中の大部分のプログラマーがすぐに使える環境にあるのだが、
Git本体はPerl依存を減らす方向に進んでいるらしい。
2020/01/28(火) 16:44:19.67ID:jIEBko3c
>>842
Cプリプロセッサを Java やら Python やらにつこうてもええんやで。

そういえば cpp を使うことを (習慣的に) 想定してる言語って C/C++ を除けばHaskell (GHC) くらい?
汎用プリプロセッサとして使うなら M4 あたりの方が賢いしなぁ……。
2020/01/28(火) 17:01:24.18ID:wcDzWZFN
>>841
たとえばこういう場合
#define STR char*
STR a, b; //これ、どうなる?

もしこうなっていたら
using STR = char*;
STR a, b; //これはどうだ?

おまえさんの好みに合うのはどっちだ?
そこに答えがある
2020/01/28(火) 17:02:35.33ID:wcDzWZFN
>>841
あ、すまんtypedefか

typedef 内容ごちゃごちゃ 名前;
using 名前 = 内容ごちゃごちゃ;

体裁が揃えやすいのはどっちだと思う?
848デフォルトの名無しさん
垢版 |
2020/01/28(火) 17:12:58.09ID:ijxMtirO
typedef も using もエイリアスという点では
char * と STR の区別が出来ないから後で困る
2020/01/28(火) 17:15:55.87ID:wcDzWZFN
関数ポインタの別名を作るときなんぞ

typedef int (*funcp)(); //内容ごちゃ名前ごちゃ
using funcp = int(*)(); //名前 = 内容ごちゃごちゃ

という違いが出る
2020/01/28(火) 17:25:49.44ID:CkOmcsmE
usingを使うと03脳が発狂する
2020/01/28(火) 17:28:55.68ID:jIEBko3c
でもまあヘッダファイルを C と C++ の両方で (マクロで少し切り分けて) 使いたいってことはあるから、
そういうときは typedef にしといた方が共用できる部分が多くて楽ってことはある。
852デフォルトの名無しさん
垢版 |
2020/01/28(火) 17:34:48.43ID:ijxMtirO
>>849
そこだけだと構文糖衣以上のメリットはないよね
2020/01/28(火) 17:46:32.93ID:aDOyN6/W
どっちでもええやん
2020/01/28(火) 17:55:35.77ID:jIEBko3c
>>849
ポインタまわりはテンプレートの記法で書けば統一的でわかりやすい気がするが、
たぶん他の名前とかぶらないようにするためか長めの名前なのがちょっとなぁ……。

using funcp = std::add_pointer_t<int(void)>;
2020/01/28(火) 18:11:09.93ID:IabgCQwH
こういうのもある。
https://qiita.com/Linda_pp/items/44a67c64c14cba00eef1
2020/01/28(火) 18:21:36.61ID:jS595giQ
>>842
PL/1はいいぞ
制御構文としてif程度しか使えないしょぼいC/C++マクロと違ってプリプロセッサでDOループやGOTOとかも使えるしサブルーチンの定義すらできるぞw
https://en.m.wikipedia.org/wiki/PL/I_preprocessor
2020/01/28(火) 19:30:49.93ID:jjtOLQOh
そういえば最近Boost.Preprocessorを使った楽しい黒魔術の話題を聞かない気がする
あれってまだ開発継続してるの?
2020/01/28(火) 20:01:44.11ID:KHL1SP2c
>>849
typedefの方が簡単じゃん
コピペして*付けて()付けるだけ
2020/01/28(火) 20:11:17.93ID:lz3/6EQt
マジでか・・・
2020/01/28(火) 20:52:12.39ID:wcDzWZFN
>>852
おまえさ、usingはテンプレートにできること、まさか知らないの?
2020/01/28(火) 22:15:34.91ID:aDOyN6/W
小学生かよw
2020/01/28(火) 23:16:15.60ID:kww99AmH
CPPってもうメンテされていないようで怖い
#define FOO 123 // comment
とはとうてい恐ろしくてどうしても書けず、
#define FOO 123 /* comment */
と書いてしまうま
2020/01/29(水) 11:25:21.25ID:HJZ6WUGV
N4713
5.2 Phases of translation
3
Each comment is replaced by one space character. New-line characters are retained.
864デフォルトの名無しさん
垢版 |
2020/01/29(水) 13:26:03.72ID:zE4LbE2k
>>860
そこだけって書いてあるのに脳内で読み飛ばずのは
国語の成績悪かったやつの特徴
2020/01/29(水) 13:40:36.68ID:HJZ6WUGV
>>864
おい852本人、「構文糖衣以上のメリットはない」という自分の言葉から逃げるのに
そういう言い訳は見苦しいぞ

今さら吐いた唾を飲むなよ
866デフォルトの名無しさん
垢版 |
2020/01/29(水) 14:13:02.30ID:pjwqAxyM
なぜ喧嘩腰なのか。
2020/01/29(水) 14:13:39.93ID:Yrzd5mtl
喧嘩腰がC++民のデフォだから
868865
垢版 |
2020/01/29(水) 14:36:19.23ID:WeNDQDRz
俺は争いは好まないが、
平和的な話し方をしないやつには
場合にもよるが嫌悪感を露にすることもある
869デフォルトの名無しさん
垢版 |
2020/01/29(水) 16:47:35.32ID:pjwqAxyM
戦士の血がそうさせると言いたいのか。
2020/01/29(水) 16:57:27.48ID:HJZ6WUGV
平和を愛するという点で共感が得られず
こちらが下手に出ることのベネフィットがない相手には容赦は無用ということだ
871デフォルトの名無しさん
垢版 |
2020/01/29(水) 17:24:59.34ID:pjwqAxyM
戦士と戦士が巡り合ってしまうと、バトル・フィールドが形成されるシステムってことか。
2020/01/29(水) 17:32:22.00ID:YYjUIAq1
>>870=ID:VrR0aqw1
マウント取りたいだけの初心者だから相手しない方がいい
2020/01/29(水) 17:39:26.08ID:iDUguYS7
>>867
多くのC++民が喧嘩腰なのでなく、一部の喧嘩好きの戦闘民族のレスが目立ってるだけじゃね。このスレから相手に勝つことだけが目的の無意味なレスの応酬を取り除いたら、1/10も残らないと思うぞ。
2020/01/29(水) 17:54:15.31ID:YYjUIAq1
いや最近のC++に対するちょっと否定的な意見が出ただけで
過剰反応する住民のせいでもあると思うぞ
で、そういう奴に限って間違いを素直に認めたりなどしないからな(代理戦争で議論するやつ特有のパターン
2020/01/29(水) 17:55:39.09ID:HJZ6WUGV
>>872
正直に言えよ、「gotoの何が悪いのか詰問されると困るから」相手しないと
マウント取られそうでヤバいんだろw
2020/01/29(水) 17:59:00.62ID:YYjUIAq1
俺ID:loc7kxiYだからgotoの話はしてないよ
で、前にも聞いたけど反論まだ?
2020/01/29(水) 18:07:15.67ID:HJZ6WUGV
ああ、そのIDのときはSTLの話だったな
そこでマクロの話も出てきていたが
隠すべきものと隠してはならないものの区別がつかない点で
gotoの何が悪いのかわかってないやつとプロファイリングが一致するんだよ

俺の正直な気持ちを教えといてやる
マウント取りたいんじゃなく、頭からアホにしてんだよ
こんなやつをマウントできたからって偉くも何ともねえ
2020/01/29(水) 18:08:48.21ID:YYjUIAq1
いやSTLじゃなくてテンプレートを持て囃しすぎって話だったんだが
まぁいいや
879デフォルトの名無しさん
垢版 |
2020/01/29(水) 18:20:58.67ID:pjwqAxyM
おまえが犯人か。
2020/01/29(水) 18:31:24.45ID:UhF+CSx9
なんかおかしなのがいるよね

圧倒的にこっちが勝っている状態で意味不明な反論?してきて意味不明だから返せないと逃げたとか言う奴
2020/01/29(水) 18:33:57.19ID:8i6C3PjP
5chなんてそんなところ
何を期待してるんだか
2020/01/29(水) 18:50:11.91ID:HJZ6WUGV
明日早いから失礼するとは言ったが
それを謎変換せにゃならん切羽詰まったやつがいるのかw
883デフォルトの名無しさん
垢版 |
2020/01/29(水) 19:02:21.51ID:pjwqAxyM
gotoは初期化を飛び越えることが出来ないと聞きました。
2020/01/29(水) 19:09:37.44ID:cVCtJzaf
usingってテンプレート使えたっけ
885デフォルトの名無しさん
垢版 |
2020/01/29(水) 19:11:38.78ID:pjwqAxyM
使えます。
886デフォルトの名無しさん
垢版 |
2020/01/29(水) 19:12:44.99ID:pjwqAxyM
初期化を飛び越えることができるバーストモードgotoないでしょうか。
2020/01/29(水) 21:34:59.03ID:QR9K5cuD
longjump
2020/01/29(水) 22:05:22.85ID:HJZ6WUGV
465のlongj【u】mp野郎まだいたのかwww
2020/01/29(水) 22:22:07.51ID:G0q9jZbg
バカほど多くの機能を使いたがるってのがプログラマーが解決しなければならん問題だな。
890デフォルトの名無しさん
垢版 |
2020/01/29(水) 22:27:38.33ID:pjwqAxyM
なんだと!
あやまりたまえ!
2020/01/29(水) 22:29:42.55ID:/kkeNUel
使いどころが悪いって指摘ならまだしも、ある機能を使い所で使うなとか言うのは結局俺が分からんからってだけだよね
2020/01/29(水) 22:32:41.05ID:G0q9jZbg
使いどころが本当に正しいか頭使って考えてりゃね。
バカは流行りだから、なんかカッケーから以上に何も考えてないから
レガシー化するわけだ。
んでまた新しいものに飛びついていく。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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