C++相談室 part142
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part137 (正しくはpart138) http://mevius.5ch.net/test/read.cgi/tech/1535353320/ C++相談室 part139 https://mevius.5ch.net/test/read.cgi/tech/1538755188/ C++相談室 part140 https://mevius.5ch.net/test/read.cgi/tech/1547326582/ C++相談室 part141 https://mevius.5ch.net/test/read.cgi/tech/1550772463/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.103【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1530384293/ ■長いソースを貼るときはここへ。■ http://codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語) ----- テンプレ ここまで ----- - VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>278 ROM上になくても const T 型で構築されたオブジェクトを書き換えたら未定義動作になるから、 値が変わらない前提の最適化は許されてるよ。 const 無しで構築されたオブジェクトを指す const& の話と混同してそうだね。 質問: c🐴++のrust相対の優位性はなんですか? >>280 正しくないコードをコンパイル出来る。 C++ はプログラマを信頼するのだ。 >>278 未定義じゃないか c++03 5.2.11の7にはこんなことが書いてある [Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer to data member resulting from a const_cast that casts away a const-qualifier68) may produce undefined behav- ior (7.1.5.1). ] >>282 Depending on the type of the objectにおいてmay produce undefined behaviorである すわなちオブジェクトの型によっては未定義動作に成りえる、 と言っているだけなのでconst T&渡しされたパラメータの書き換えがNGの祥子にはなんね >>279 >const T 型で構築されたオブジェクトを書き換えたら未定義動作になる それはそう。しかしconst T&渡しされた関数内でコンパイラはそれを判断できないから そういった関数内で、参照型かポインタ型引数で関数に渡されたlvalueのconst_castした結果はあくまでlvalue扱い のはず… >>283 関数内では const& であることを根拠に最適化に使えないのは合ってる。 でもだからといって const& で受け取ったものを書き換えてもよいとは言えない。 void f1(int const&); int f2() { int const x = 1; f1(x); return x; } x は int const なので、 f2() の return x は f1() が const_cast して x を 書き換える可能性を無視して return 1 に最適化できる、という話。 BarWithBigData const x; が >>275 のコピーコンストラクタに渡された後も const_cast<BarWithBigData&>(rhs).m_pBigData = NULL; を無視して書き換え前の m_pBigData が使われる可能性がある。 規格が云々言わなくても、9割のプログラマの意図に反してるで終わる話 頼むからそんなコードは頭の中にしまっといてほしい つまりはそれ自体は問題ないが、constとして生成したオブジェクトを渡した瞬間にダメになると言うことか で、渡すこと自体は制限できないから プログラム中に罠を仕掛ける事が出来るわけだ。 const_castも要らないし良いことずくめじゃないかw >>285 わかりたそうする。>>275 のケースは素直にムーブコンストラクタを使えば良い。または↓でもだいたいおk BarWithBigData::BarWithBigData(BarWithBigData& rhs) { m_pBigData = rhs.m_pBigData; rhs.m_pBigData = NULL; } だいたいというのはムーブコンストラクタ有りの規格のC++コンパイラで↑の非constなコピコンだけ書く警告が出ることがあるからイヤン、 >>286 >つまりはそれ自体は問題ないが いや問題がある可能性が潰せていない。 void f1(int const&); int f2() { int x = 1; f1(x); return x; } (xがconst無し)の場合であってもf1(x)がxを書き換えない前提の最適化がf2()にかかったりすると、 f1(x)内で変更したxの値がreturnされるxの値に反映されない可能性がある(f1(x)の呼び出し前後でxがレジスタに乗ったままであるとか、 >>289 その x の型は const じゃないから return x は最適化できないよ。 ラムダに11個の引数を参照で渡すのと、キャプチャするの、どっちが速いかな? >>291 メリットのときもデメリットのときもあるだろう。 参照渡しな時点でその場で呼び出すのだろ。 最適化かければ結局同じようなアセンブリになるよ。 それはわからんだろ ブロック待ちするかもしれないわけで 引数で渡すとスタックに積まれる可能性があるけど、キャプチャするとそうならないのでは。 いや、形式上は無名クラスにキャプチャを変数としてぶちこんだもののインスタンス作ってメンバ関数のoperator()呼ぶのだから、スタックは使うだろ。 >>298 じゃあ、引数で渡すとスタックに積まれない可能性があるので、速い場合もあるのでは? 海外だと、Javaに負けて、Rustに圧倒的実力で追いやられるC++ 本当に、コンパイル時に何かしたいならRustだけどね 全部足すと500%位になりそうだから、複数の言語を使う人が多いんだろね。 江添が転職できずに困っとるw まあこいつがクソなだけでc++の問題ってわけじゃないんだがイメージは悪いわな。 こうしてみるとホッシーの全タクシー移動ってのは理に適ってるな バカな公害に捕まる心配が減る 喫煙者が目に入った途端癇癪起こして殴り掛りかかる狂犬なんだっけ? 知らね よく人を招いているようだし揉めたことがある人も少なくはないんじゃいか >>310-311 当事者の様々な主張の食い違いがあるので、結論としては「わからない」。 少なくとも彼自信の主張としては掴みかかってきたのを払いのけた結果として眼鏡が割れたということになっている。 (江添が殴りかかったわけではなく、むしろ防衛した側、と江添は主張している。) 江添が煙草について過激な意見を持っているのは確かだが、 シェアハウス内で禁煙場所であると合意がなされている場所で煙草を吸った客人がいたというところは当事者全体が認めているようだ。 恨みというかまともにコード書かない奴がクソ意見で現場荒らすって事自体がクソだと思うわけで、 まあその反動で現場で働くことができないって事になればザマァって思う。 どのプロジェクトにも参加してないと認識してたけど乗り込んでケチつけてたりするのかな まあ俺ドワンゴとは縁が無いからどこで何してようが関係ないけど C++がPython抜いて3位 - 4月TIOBE言語ランキング 2019/04/17 10:55 後藤大地 https://news.mynavi.jp/article/20190417-810363/ TIOBE Softwareから、2019年4月のTIOBE Programming Community Index (PCI)が公開された。 TIOBE PCIは、複数の検索エンジンの検索結果から、対象となるプログラミング言語が どれだけ話題になっているかをインデックス化したもの。 4月TIOBE Programming Community Index / 円グラフ https://news.mynavi.jp/article/20190417-810363/images/001.jpg 2019年4月はC++がPythonを抜いて3位に返り咲いた。ただし、Pythonのシェアが下落したの ではなく、Pythonの増加傾向をC++の増加が上回ったことによる結果と思われる。C++は 長期にわたって下落傾向が続いていいたものの、2019年に入ってから増加傾向へ転じている。 Pythonも増加傾向が続いており、どちらも今後さらにインデックス値を増やす可能性がある。 長期にわたって1位を確保しているJavaは依然として1位のポジションにあるが、下落の 傾向が続いている。2位のC言語も長期で見ると下落を続けており、C++やPythonの存在感が 強くなってきている。 >>317 何回だからみんな何回もググってるんだよ 今もしインターネットが完全にシャットダウンされると プログラム書けなくなるプログラマけっこう数いるだろうな >>320 cpprefjp はとりあえず手元にダウンロードしてあるけど。 どうやってダウンロードしたの? 巡集じゃできなかった… 江添は職質裁判でも、不当判決が出たので控訴するみたい 警官は、複数人で口裏合わせするから、民間人は勝てない 漏れもやられたけど、酒酔い運転でも、漏れが機械に息を吹き掛けても、ランプが点かない。 そこで、警官がクルッと後ろを向くと、ランプが点く そっと見たら、酔っ払い警官が、自分で息を吹きかけて、ランプを点ける こういう裁判で争っている人もいるけど、 警官は複数人で口裏合わせするから、絶対に勝てない! 警官は皆、このやり方で出世しとる ありゃ普通に対応してりゃ済む話だと思うがね。 やってることは完全に当たり屋だろ。 >>326 Rubyバカの人か。相変わらず思い込みが激しく、言っていることが滅茶苦茶だな。 だけ、というのは言い過ぎだと思うが、 日本語で最新の C++ の事情を本にしているのは江添くらいしかいないからなぁ。 江添本人は自分のことを実務家ではなく教育者だと考えているようだし、 (肩書は何なんだろ? エヴァンジェリストのようにも見えるが……) 今のポストは妥当なとこだろ。 そのままやってくれればありがたいもんだ。 江添個人の裁判は完全にスレチなんだよなあ 仮に違法な取り締まりだと判断されても警察のやり方が改まるわけもないだろうし 江添すなわちC++なのだから 江添の話題は全てC++の話題だょ こんな事言うと勘違いされそうだが、はちみつ餃子はちゃんとしてると思うよ C++に関しておかしなことは言っていない ていうか、はちみつ餃子ってものすごい不味そうなんだがそんなの本当にあるのだろうか・・? 肉料理にはちみつを入れること自体はわりと普通 量の問題 いや明らかに開発してねーだろって感覚じゃねーか。 まあここならそれでもいいんだろうけれど。 >>338 ググればわかるけどはちみつ餃子はそこそこありふれた料理だよ。 その昔、 higepon が自分でもどうして higepon などと名乗ったかわからない と述べていたので、そのくらい意味不明感じにしようと思って適当に 思いついた語をコテハンにした。 Scheme スレが本来の住処なので当初は SCHEME餃子 と名乗っていたけど、 他のスレにも顔を出すようになったのでなんとなくはちみつ餃子になった。 およそ意味不明な組合せにしたつもりだったんだけど、 実際にある料理だとは後になってから知った。 initializer_listを引数に取るオブジェクトを引数に取る関数で 下記のケースでUniversal Initializationが効かないのですが 何かいい手はないでしょうか using KVPCollectionType = std::map<std::string, std::string>; void f(const KVPCollectionType&& kvps = {}); f(); // OK f({}); // OK f(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); // OK f({{"key1", "value1"},{"key2","value2"}}); // NG これをやりたい!! すみません、訂正です × void f(const KVPCollectionType&& kvps = {}); ○ void f(const KVPCollectionType& kvps = {}); アークエンジェルに搭載されてるstd::variant<>。 wandboxで試したらclangでもgccでもc++11 -pedanticで通ったけど? ごめんなさい、ごめんなさい。本当にごめんなさい。 勝手に脳内で要約したのが間違えまくってました 正確には以下の通りです。 #include <map> #include <memory> using KVPCollectionType = std::map<std::string, std::string>; class c { public: c(const KVPCollectionType&& kvps = {}){} }; int main() { auto ok = std::make_shared<c>(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); // OK auto ng = std::make_shared<c>({{"key1", "value1"},{"key2","value2"}}); // NG!!! } 全てのバグを絶滅せよ。 「今日は死に日和」好評発売中。 C++11や14を使ってる人、コンパイラは何ですか。 Twitchでプログラミングしてるやつの中でゲームエンジンも居たような >>347 テンプレートの推論ルールとして「関数テンプレートのパラメータとして波カッコの初期化子リストを渡して型推論させることはできない。」 ということになっている。 ( https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html ) make_shared の実際の型は template <class T, class... Args> shared_ptr<T> make_shared(Args&&... args); なので、 このとき Args が推論できない以上はどうにもならん。 型を固定した専用の関数をはさんでこんな感じにするくらいのことしか思いつかないな。 #include <map> #include <memory> #include <initializer_list> #include <utility> using KVPCollectionType = std::map<std::string, std::string>; class c { public: c(const KVPCollectionType&& kvps = {}){} c(const std::initializer_list<typename KVPCollectionType::value_type>){} }; std::shared_ptr<c> make_c_shared(std::initializer_list<typename KVPCollectionType::value_type> a) { return std::make_shared<c>(std::move(a)); } std::shared_ptr<c> make_c_shared(KVPCollectionType&& a) { return std::make_shared<c>(std::move(a)); } int main() { auto ok = make_c_shared(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); auto ng = make_c_shared({{"key1", "value1"},{"key2","value2"}}); } >>347 >>354 呼出す側で auto ng = std::make_shared<c, std::initializer_list<typename KVPCollectionType::value_type>>({{"key1", "value1"},{"key2","value2"}}); というように型を明記してもかまわないけど、使う側でいちいちこんなこと書きたいわけじゃないだろ? >>347 ちゃんと考えたら >>354 はいらんことしとるな…… これで充分か #include <map> #include <memory> #include <utility> using KVPCollectionType = std::map<std::string, std::string>; class c { public: c(const KVPCollectionType&& kvps = {}){} }; std::shared_ptr<c> make_c_shared(KVPCollectionType&& a) { return std::make_shared<c>(std::move(a)); } int main() { auto ok = make_c_shared(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); auto ng = make_c_shared({{"key1", "value1"},{"key2","value2"}}); } >>354-356 ありがとうございます、その手を使わせていただきます 状況によって推定ルールが変わるのはやめて欲しいなってちょっと思ったんですけど。 エディタの補完機能使いたいときにたまにそうやって補完して最後に消す。 が、たまに忘れる。 IDEの都合で付ける事が良くある 付けないと補完候補多すぎて メンバ名は頭にm_付けろみたいなクソルールよりずっといいと思うので付けるべき 仮引数と別の名前つけるのだるいからm_は別に良いと思う 引数そのままメンバに入れるなら引数に_つけてvar(_var)って初期化してるわ >>366 それって var(var) でも問題ないんですよ… ハンガリアン記法は、入力補完のないエディタ上での可読性を高めるのに役立ってるでしょ。今でも。 定期的にunsignedとsigned混在させてハマるアホをみるとハンガリアン必要だと思うわ C#で入力補完のないエディタがどうとかさすがにナンセンスでは だってvisual studio使うじゃん どっちでもいいわ。 大抵の場合そんなとこに気を使わんといかんコードになってることのが問題。 >>375 こういうやつがそのうちハマって丸1日つぶしたりするんだよなw ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる