1 名前:デフォルトの名無しさん [2022/02/19(土) 11:56:42.14 ID:kSnJ/KwP.net] 前スレ C++相談室 part158 https://mevius.5ch.net/test/read.cgi/tech/1636969758/
403 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:16:37.08 ID:aciaBeWI.net] 出たよサンプルないと何もできないおじさん
404 名前:蟻人間 mailto:sage [2022/03/04(金) 22:33:11.96 ID:08B25WN2.net] https://qiita.com/ta_dragon/items/1828ceb16bc8733526e1 貼っとくよ。
405 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:42:39.88 ID:rsYyHWe+.net] constexpr std::string s="test"; constexpr std::wstring ws=L"test"; こいつらが通らない時点で俺は諦めた 最終的にほしい型はstd::wstring_viewだろうけど std::array<wchar_t, size>ならなんとかなるかもしれん
406 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:52:27.11 ID:nHKPE6Wj.net] そもそもウクライナに寄付しろとか言う前に他民族、多言語に対応しろとmagic_e
407 名前:num作者にメールすべき。 [] [ここ壊れてます]
408 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:57:11.67 ID:4zB49VIz.net] 違うだろw こいつが動かせてないだけだろwwww
409 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 23:05:31.04 ID:TVZZL9aI.net] >>399 まさにnameofと同じ作者のものだけど、やっぱ__FUNCSIG__の部分からLつけていくしかなさそうだな
410 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 00:24:50.51 ID:AqnMHu7I.net] まだ動かせないんかいw
411 名前:蟻人間 mailto:sage [2022/03/05(土) 00:27:03.13 ID:z+1i+qt8.net] L##
412 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 00:45:32.11 ID:E2o+9AFP.net] C##
413 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:02:31.13 ID:AqnMHu7I.net] 一応言っておくと__FUNCSIG__はリテラルじゃなくてシンボルだぞw >type hoge.cpp hoge(__FUNCSIG__); >cl /P /std:c++17 hoge.cpp Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29912 for x86 Copyright (C) Microsoft Corporation. All rights reserved. hoge.cpp >type hoge.i #line 1 "hoge.cpp" hoge(__FUNCSIG__); > なんというか...ロクに動かせもしないアホが一足飛びに余計なことして普通なら瞬間に出来ることを他人様に何度も何度も聞いて回るというねw
414 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:13:20.54 ID:rFZZ/Cia.net] >>407 >__FUNCSIG__ 外側の関数のシグネチャを含む文字列リテラルとして定義されます。 直接Lは付けられないが#define L(x) L##xを使えばちゃんとワイド文字リテラルとなる ついでに言っておくとVSのこの手のマクロはANSIではなくUTF8だったと思うぞ(固定ではなくソースコードの文字コード依存の可能性あり)
415 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:23:21.22 ID:AqnMHu7I.net] utf8は正解なんだが、リテラルは不正解w https://godbolt.org/z/4G1vvhrEc コンパイラがリテラルに置き換えるわけだけど、プリプロセッサではシンボルのままなので置換されると分からなくなるw
416 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:25:23.87 ID:AZBfqXsc.net] MSVCの場合 /execution-charset で指定した文字コード(デフォルトはsjis=cp932)になるんじゃなかったかな
417 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:37:21.06 ID:AqnMHu7I.net] 未
418 名前:指定時はソースと同じらしい https://docs.microsoft.com/ja-jp/cpp/build/reference/execution-charset-set-execution-character-set?view=msvc-170 でutf-8になってたようだな [] [ここ壊れてます]
419 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:47:40.22 ID:AqnMHu7I.net] ただし、__FUNCSIG__はそういうのに影響されずutf-8っぽい 普通のリテラルはちゃんとシフトJISで出るけど、__FUNCSIG__はutf8だな
420 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:49:42.38 ID:AZBfqXsc.net] ややこしいな、そういうのが一番困るんだよねw
421 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:52:53.77 ID:AqnMHu7I.net] MSにありがちw ただシンボルに日本語とかキチガイしかしないからw
422 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 06:57:02.25 ID:RhJCMKRm.net] >>414 だって規格で認めてるじゃん ISO/IEC 14882:2020(E) 12.8 User-defined literals [over.literal] 8 [Example 1: template <char...> double operator "" _\u03C0(); // OK: UCN for lowercase pi
423 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 07:14:15.82 ID:2Lq6XwwP.net] 引用が仕様ですらないし、引用元もないし、、、挙げ句内容的に__FUNCSIG__はシグニチャ付きの関数名がリテラルとして入るだけだぞw その関数名に日本語使うのキチガイだけだろw リテラル調べてどうするんだよw
424 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 07:41:36.14 ID:RhJCMKRm.net] 関数名の一部ってことわかんない?
425 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 12:31:32.96 ID:2Lq6XwwP.net] 君に何かを理解してもらうのは諦めるよ 俺の力では無理
426 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 12:38:21.73 ID:RhJCMKRm.net] 捨て台詞にしてももうちっとくらいマシなこと言えねえの?
427 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 20:42:37.07 ID:padO6mVy.net] >>395 初心者だけどこれってプログラム内の変数名や関数名に日本語を出したいってこと? あ = 3; みたいな
428 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:21:28.85 ID:yDdB4j8G.net] 規格上はもうUnicodeの文字はだいたい使えるぞ 移植性やコーディングスタイルや常識の観点での良し悪しは別にして
429 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:29:08.28 ID:ivurCOzA.net] >>420 俺抜きでレスバしてて恐縮だが enum class AIUEO { あ, い, う, え, お }; const wchar_t* aiueo[] = { L"あ", L"い", L"う", L"え", L"お" }; enumに合わせてこんな感じで文字列も欲しいってこと utf8からutf16へのエンコードは割と簡単に実装出来るという事が判明して、200行くらいかかったけどconstevalなu8_to_u16関数作ってmagic_enum::detail::n部分からwide版作っていくことで解決できた
430 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:34:05.04 ID:yDdB4j8G.net] ええやんプルリクしといてよ
431 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:39:53.01 ID:ivurCOzA.net] いいけど既に同じようなissue出してる人いて「constexprに文字列返されるので別の形にしたいならそっちで自由にやって」みたいな感じだったからな
432 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:55:07.26 ID:uQvWeikk.net] これだから白人は嫌なんだよね。
433 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:58:54.49 ID:2Lq6XwwP.net] 昔からキチガイがシンボルに日本語使ってたりしたし、規格仕様の該当項目も挙げてないのに可能というのはおかしく またソースコードや出力設定が何かに依るのが正しい可能性だって普通にある またutf8というかunicodeとそのエンコーディング形式は簡単な計算式で可換 200行あればvc++固有ならmagic_enumの使用機能全て載せられるし、そもそも不要 そもそも情報小出しな時点、puts使ったりしてる時点、vc++を好き好んで使ってる時点でもうね・・・ 挙げ句説明なくても5分もあれば気づくことに何日かかってるのかって人のプルリクが通るわけないだろw
434 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:18:01.19 ID:ivurCOzA.net] >>425 まぁ面倒だからってよりこのスレにもちらほらいるようにASCII文字だけを想定してて それだけなら1文字づつキャストするだけで簡単に出来るだろうしusing string_view = std::string_viewの所を上書きできるようにしておくから自前でやってって感じだな
435 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:23:59.38 ID:2Lq6XwwP.net] 「ASCII文字だけを想定してて」wwwww
436 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:29:43.95 ID:m7T5bZFc.net] マクロ騒動で脳が破壊されてしまった子がいるね
437 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:46:00.91 ID:47rZ/1iq.net] SEXの時は動かずにマグロになってしまったようですね やっぱりロボトミー手術してよかったですね
438 名前:デフォルトの名無しさん mailto:sage [2022/03/08(火) 21:56:42.93 ID:A5UfccGR.net] >>422 はえー解決したなら良かった まだまだ勉強不足だから半分理解できなかったけどconstexprはstring_view型なら使えることは学んだ
439 名前:デフォルトの名無しさん mailto:sage [2022/03/08(火) 22:58:13.81 ID:2Ie6O3y5.net] はいはい、一人何役するのかねw
440 名前:デフォルトの名無しさん mailto:sage [2022/03/08(火) 23:19:40.19 ID:lL5N1LvC.net] >>432 我々ギフハブがいつも見ているぞ
441 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 18:10:06.68 ID:USdHjBxA.net] テンプレートの可変長引数って一般的な実装だとスタックに積まれるの? てことはあんまり大きいデータは渡せない?
442 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 18:17:21.80 ID:6o5PvaaD.net] template-parameter-packは実行環境では普通の引数と全く同じだ 翻訳中の解釈でどんな「普通の引数」にするか判断してるだけ
443 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 21:39:59.02 ID:xy5Q90JZ.net] template<class...T>void f(T...t){} f(1,2,3,4); で実体化されるf<int,int,int,int>は、 void f(int,int,int,int){} と同じ扱いをされる。 普通の関数と変わらんよ。 たぶん気にしてるのはこんな感じの再帰実装だろう template<class First>auto sum(First first){return first;} template<class First, class Second, class...Rest> auto sum(First first, Second second, Rest...rest){ return first+sum(second, rest...); } sum(1,2,3,4,5,6,7,8,9); 最適化なしコンパイルだとクソ真面目に45*sizeof(int)と9段分のリターンアドレスとか諸々をスタックに積む 最適化ありコンパイルなら大体インライン展開されるからさほど大事にはならない
444 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 07:47:35.25 ID:GmBPyzdt.net] #include <utility> template<class First>auto sum(First first){return first;} template<class First, class... Rest> auto sum(First first, Rest... rest){ return first+sum(rest...); } template <class T, T... Seq> auto sum_seq(std::integer_sequence<T, Seq...>) { return sum(Seq...); } int main() { return sum_seq(std::make_index_sequence<100>()); } こんな感じになるよ https://godbolt.org/z/obj4ra671 途中経過のテンプレートも全て関数実体として展開される 最適化すると、この例だと全部定数で計算されるけど
445 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 08:12:59.76 ID:GmBPyzdt.net] 流石にちょっと説明追加しておきます。 sum_seq(std::make_index_sequence<100>())の部分は sum(0,1,2,3,...,97,98,99)と同じです。 sum(0,1,2,3,...,97,98,99)は sum(0) + sum(1,2,3,...,97,98,99)で計算されます。第2項の sum(1,2,3,...,97,98,99)は sum(1) + sum(2,3,...,97,98,99)で計算されます。第2項の sum(2,3,...,97,98,99)は ... sum(98,99)は sum(98) + sum(99)で計算されます。 つまりすごい再起的に呼び出してバカ正直に壮絶な計算をするため、スタック消費も大きいということ。
446 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 08:30:00.26 ID:bj9xq9MP.net] おれおれtemplateの例ですね。
447 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 11:44:15.06 ID:yxfxX1kD.net] 普通はテンプレつかった可変引数でも、イニシャライザでforで回して足して終わりっしょ。 なぜ自分で再帰にして書くのやら。
448 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 12:14:25.50 ID:GmBPyzdt.net] >>440 一般には可変長テンプレート引数の型が一律とは限らないので
449 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 12:45:09.09 ID:FGXUCKCr.net] >>440 initializer_listは実行時の解釈なので 翻訳時に全てを解決できるテンプレートを使っていて それが出てきてしまうと残念な気持ちになる
450 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 19:55:16.89 ID:XC1WHC10.net] constexprでやればいいじゃん
451 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 19:58:15.85 ID:bj9xq9MP.net] なんでもtemplateにしたい病なんですよ。プロジェクトで一番迷惑なタイプです。 おれおれtemplateは可読性、保守性が一気に落ちるので勘弁してください。
452 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 20:09:30.59 ID:rOwnBpGX.net] 読む方は溜まったもんじゃないが書くのも実行速度もなんだかんだテンプレートが一番早いんで…
453 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 21:26:30.13 ID:FGXUCKCr.net] >>444 純コンパイラ方式の言語を使ってるのに 中間コードを使わにゃならんところが出てくると 残念な気持ちにならん? もっと極端に言うとアセンブラからBASICやBATを呼び出すようなこと 人それぞれで何も感じない人っているのかね
454 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 22:03:21.13 ID:GmBPyzdt.net] 例えばさっきのシーケンスをランダムな数字をその場で生成みたいな感じにすると、 #include <random> #include <iostream> #include <utility> using namespace std; template<class First>auto sum(First first){return first;} template<class First, class... Rest> auto sum(First first, Rest... rest){return first+sum(rest...);} template<class... Args> auto print_and_sum(Args... args) { for (auto e: {args...}) cout << e << endl; // ココ return sum(args...); } template <typename F, size_t... Seq> auto gen_and_print_and_sum_impl(F func, index_sequence<Seq...> ) { return print_and_sum(func(Seq)...); } int main() { random_device seed_gen; mt19937 engine(seed_gen()); const size_t n = 3; cout << gen_and_print_and_sum_impl( [&](size_t i){ return engine();}, std::make_index_sequence<n>{}) << endl; return 0; } こんな感じになるけど、genとprintとsumを分けたいとなるとtupleにしたくなって、templateでparameter packとtupleを行き来することになり、結構煩雑になる気はする 今は分けずに初期化リストにぶち込んで誤魔化してるけど… こういうのも分けてtemplateにする?
455 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 22:03:23.71 ID:bj9xq9MP.net] >>446 加算するだけの処理でtemplate使わない場合 どういった中間コードが作成されるのですか?
456 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 22:52:13.11 ID:GmBPyzdt.net] ちなみに分けてテンプレートにしてみた。もう1レスに収まらないので消えたらごめんw https://godbolt.org/z/YoxG7b4ro
457 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 23:14:03.97 ID:GmBPyzdt.net] #include <random> #include <iostream> #include <tuple> using namespace std; // 余計なコード消したらギリギリ入ったw template<class First>auto sum(First first){return first;} template<class First, class... Rest> auto sum(First first, Rest... rest){return first+sum(rest...);} template<typename T, size_t... Seq> auto sum_tpl_impl(const T& tpl, index_sequence<Seq...>) {return sum(get<Seq>(tpl)...);} template<typename... Types> auto sum_tpl(const tuple<Types...>& tpl) { return sum_tpl_impl(tpl, make_index_sequence<tuple_size<tuple<Types...>>{}>{}); } template <typename T, typename F, T... Seq> auto gen_impl(F func, index_sequence<Seq...>) { return make_tuple(func(Seq)...); } template <size_t N, typename F> auto gen(F func) { return gen_impl<decltype((func)(0))>(func, make_index_sequence<N>{}); } template <typename T, size_t... Seq> void print_impl(const T& tpl, index_sequence<Seq...>) { for (auto e: {get<Seq>(tpl)...}) cout << e << endl; } template <typename T> void print(const T& tpl) { print_impl(tpl, make_index_sequence<tuple_size<T>{}>{}); } int main() { random_device seed_gen; mt19937 engine(seed_gen()); const size_t n = 3; const auto tpl = gen<n>([&](size_t i){ return engine();}); print(tpl); cout << sum_tpl(tpl) << endl; return 0; }
458 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:11:11.84 ID:uDPm4ane.net] 大学で下記のようなSTLアルゴリズムの課題が出たのですが、全然わからないです Hogeというstructがあったときに、 class HogeCollection { public: void display(ostream& os) const; friend ostream& operator << (ostream& os, const Hoge& hoge); private: vector<Hoge> m_hoges; }; display関数でm_hogesのすべてのHogeに対して os <<を呼び出し出力させなさい。 ただしforやwhileなどの手動ループを使用しないこと。
459 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:12:32.40 ID:aEfI8PjB.net] >>450 ちょっとバグってたので修正 template <typename F, size_t... Seq> auto gen_impl(F func, index_sequence<Seq...>) { return make_tuple(func(Seq)...); } template <size_t N, typename F> auto gen(F func) { return gen_impl(func, make_index_sequence<N>{}); }
460 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:14:20.70 ID:aEfI8PjB.net] >>451 言われた通りにやればいいやん
461 名前:蟻人間 mailto:sage [2022/03/12(土) 13:16:03.75 ID:0xm7vL+e.net] >>451 <algorithm>を見てみ。便利な関数があるから。
462 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:21:05.85 ID:45uBSPYW.net] 「STLアルゴリズム」の課題だからSTL使えばいいんだもんな… 自分でアルゴリズム実装しろって課題だったらちょっと面倒だが
463 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:21:47.65 ID:uDPm4ane.net] >>453 ,454 ありがとうございます。 std::for_each()なんてのがあるんですね・・・
464 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:55:39.46 ID:uDPm4ane.net] 度々すみません。 display関数を書いたのですが、VS2019でコンパイルエラーになります。 void HogeCollection::display(ostream& out) const { std::for_each(m_hoges.begin(), m_hoges.end(), [](const Hoge& hoge){ out << hoge; }); } error C3493: 既定のキャプチャ モードが指定されていないため、'out' を暗黙的にキャプチャできません
465 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 14:02:30.95 ID:9rXKBdgd.net] キャプチャモードを指定してあげれば…
466 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 14:09:52.70 ID:uDPm4ane.net] >>458 ありがとうございます。以下で通りました! [&out](const Hoge& hoge){ out << hoge; }
467 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 21:02:47.42 ID:uDPm4ane.net] もう1つ、STLの問題がわからないので、質問させてください。 >>451 のHogeCollectionに以下のようなメンバ関数があるとします。 void sort_by_key(const string& key) { if (key == "a") (Hogeのメンバ変数 m_aでソート); else if (key == "b") (Hogeのメンバ変数 m_bでソート); } keyの値が"a" か "b"以外のときはエラーにしたい場合に、 実行時エラーでなくコンパイルエラーにするには、 この関数をどのように再設計すればよいでしょうか。
468 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 21:08:31.31 ID:yBTVs/aF.net] keyの値はコンパイル時に決まるん?
469 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 21:49:16.97 ID:uDPm4ane.net] >>461 そうですね。 今のプログラムでは、main関数で sort_by_key("a"); のように呼び出しています。
470 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 22:30:59.53 ID:olrB42jq.net] >>462 コンパイル時にkeyを見てチェックするという縛りなら、実行時になるまでkeyがわからない状態にはできない。 雑にやってしまうならこうなる。 真面目にやるならフィールドへのポインタをテンプレート引数にすることになると思う template<char key> void sort_by_key() { if constexpr (key == 'a') (Hogeのメンバ変数 m_aでソート); else if constexpr (key == 'b') (Hogeのメンバ変数 m_bでソート); else throw std::invalid_argument(); }
471 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 22:46:39.28 ID:uDPm4ane.net] >>463 やっぱそうですよね。 私も sort_by_keyを廃止して、sort_by_a と sort_by_b を作るくらいしか 思いつかないです。
472 名前:デフォルトの名無しさん [2022/03/13(日) 18:52:37.38 ID:mTtq0Uph.net] ポインタとか文字列の勉強をしていてよくわからなくなってしまいました char* test(char* &s){ char* ans=“B”; s[0]=‘C’; s=ans; return ans; } int main(int argc,char *argv[]){ char s1[]=“A”; char* s2=s1; #if 1 cout<<s2; cout<<test(s2); cout<<s2; #else cout<<s2<<test(s2)<<s2; #endif return 0; } 上のようなものを動かす時、#if 1のときはABBと表示されて、#elseにするとBBCと表示されます #elseのように一行にまとめた時に何が起こっているのかよくわからないので教えていただけると嬉しいです よろしくお願いします
473 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 18:56:08.61 ID:wq
] [ここ壊れてます]
474 名前:c4hozV.net mailto: ポインタじゃなくて評価順の問題なのはわかるが 何が起きてるのかは俺もようわからん [] [ここ壊れてます]
475 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:00:28.93 ID:wF3w3WV7.net] char*&なんて20年C++プログラマやってて一度も使ったことないわ… どういうときに必要になるん?
476 名前:デフォルトの名無しさん [2022/03/13(日) 19:02:39.85 ID:mTtq0Uph.net] 必要ないとは思うんですけど、理解を確かめるために色々試していたって感じです
477 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:02:42.19 ID:uIbezUFD.net] >>467 おっちゃんやん
478 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:05:39.12 ID:wqc4hozV.net] あーわかったけど説明めんどくさいな とりあえず、if 1では1行ずつ評価(今の場合表示と読み替えても良い)が行われてるが 2行目の場合、評価(表示)の前に途中で関数が実行されて、値が書き換えられている、とだけ
479 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:06:08.61 ID:e39Fa4ck.net] コレ質問してるのもおっちゃん臭いんだよな いつもVC++だし、MFCみたいな書き方するし
480 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:06:22.60 ID:wqc4hozV.net] 誤 2行目の場合→正 elseの場合
481 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:12:14.63 ID:wF3w3WV7.net] >>469 おう、最近白髪が気になってきた
482 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:20:55.04 ID:e39Fa4ck.net] そして答えてるのも同じおっちゃんw
483 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:22:15.18 ID:e39Fa4ck.net] そもそもそんな怪しいコーディングは普通のC++プログラマはしないから warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
484 名前:はちみつ餃子 mailto:sage [2022/03/13(日) 19:38:16.17 ID:lhgOY5DD.net] 文字列リテラルの型は const char[] だが、 C++03 時代は const をはがして char* に (暗黙に) 型変換することが許されていた。 文字列リテラル限定の特別な型変換規則。 C++11 以降ではその規則は削除された。 C++03 時代でも非推奨なんだけど昔の本だとちょくちょくやってるんだよなぁ。 俺は持ってないから知らんけどロベール本とか有名な本でもそういう記述があるらしい。
485 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 19:51:18.33 ID:hJwK9XXb.net] ロベール本は<iostream.h>とか書いてあったしC++03ですらないんじゃない?
486 名前:デフォルトの名無しさん [2022/03/13(日) 19:54:43.65 ID:mTtq0Uph.net] >>470 すみませんやっぱりよくわからなかったです アドレスとか調べてみてみました 元の初期化されたばかりのs2を@、ansをAとします •#if1において 最初の(1行目の)s2は@を指している 最後の(3行目の)s2はAを指している •#elseにおいて 最初の(左の)s2はAを指している 最後の(右の)s2は@を指している どうやらこうなっているようなのですが、なぜ逆になるのでしょうか?
487 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:06:11.90 ID:GnTJD4Pm.net] >>471 VC++以外のがLinuxおじさんってイメージがある 実際ワイは平成2桁生まれやけどVC++しか触ったことないわ Windowsじゃないとゲームしづらいし
488 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:12:18.98 ID:e39Fa4ck.net] そんな調べれば一瞬で分かるようなこと自分で調べろよおっさんw
489 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:13:33.25 ID:e39Fa4ck.net] お前の間違いをいちいち指摘するのは最近もう面倒w ヒントはあげたしw
490 名前:デフォルトの名無しさん [2022/03/13(日) 20:14:46.38 ID:mTtq0Uph.net] あなたには聞いたつもりはないのですけど…
491 名前:蟻人間 mailto:sage [2022/03/13(日) 20:18:18.08 ID:+6IhxTlU.net] どいつもこいつもおっさん
492 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:28:56.19 ID:GnTJD4Pm.net] おっさんって大体C++17以降アレルギーもってるよな 言語の進化に付いていくのをやめると新機能への愚痴ばかり言う老害になっちゃうんだよな ああはなりたくないからC++40くらいまでは初心を忘れず学習し続けると心に誓うわ
493 名前:蟻人間 mailto:sage [2022/03/13(日) 20:35:15.04 ID:+6IhxTlU.net] WinXPをサポートしている最新のC++規格となると選択肢が少なくなるのが嫌になる。
494 名前:デフォルトの名無しさん [2022/03/13(日) 20:35:18.33 ID:R0s3zSYd.net] Rustに変わるのでは?
495 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:56:20.40 ID:e39Fa4ck.net] linuxだとgcc 9か10がデフォルトだし、9,10のデフォルトのc++標準は14だから 現状17,20は断らないと使えないので、自分で使う分以外は可能なら11、無理でも14までにしたいというだけ VC++2022を除き20はデフォルトだと使えないので、自分で使う分でも20は滅多に使わない twitterとかで記事を見かけたら23までは内容見たりするけど、自分で追っかけるのは17まで、興味があれば20までかな 23だとrangeがすごいことになってるみたいね
496 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:57:02.88 ID:BWiYjhGb.net] >>478 評価の順と関数の実行が同じとは限らない。 だったかな 要するに cout<<s2@<<test(s2)A<<s2B; 君の考えでは@の評価、関数test(s2)Aが実行されtest(s2)Aの評価、最後にs2Bが評価される、だろうけど 実際には先ににtest(s2)Aが実行され、その後s2@の評価、test(s2)Aの評価、s2Bの評価と続く って感じと思う
497 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 20:57:21.78 ID:GnTJD4Pm.net] >>478 言語バージョンはいくつ? 逆になってるというよりC++17未満だと#elseのほうの評価順は未定義だからてきとーになってるってことだと思うが
498 名前:蟻人間 mailto:sage [2022/03/13(日) 20:59:06.58 ID:+6IhxTlU.net] LinuxでDirty Pipeの脆弱性が出たからバージョンアップしとけよ。
499 名前:デフォルトの名無しさん [2022/03/13(日) 21:22:04.20 ID:mTtq0Uph.net] >>488 >>489 ありがとうございます https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html それっぽいのを見つけたので詳しく読んでみたと思います 言語のバージョンは多分C++11てやつです GCC4.4.0のコンパイラーでした 本の付録についてきたものですが、結構古いやつだったみたいです コンパイラー新しくすればもしかしたら動くのかもしれないですけど、あんまりこういうことはしないほうが安全なんでしょうかね
500 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 21:30:44.52 ID:5qwn5s+6.net] >>478 この手の副作用が2つ以上現れるような動作は未規定か環境依存か未定義動作だったりを疑わなきゃいけない cout<<s2<<test(s2)<<s2; の評価順序は規格で決まってる? Noならコンパイラの気分次第で変わったりする。 何が起きてるかを知るにはコンパイル結果の逆アセンブリを見るのが一番手っ取り早い
501 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 21:33:21.26 ID:e39Fa4ck.net] ちなみにVC++だと2019のオプション指定なし(C++17)で再現するんだけどねw
502 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 21:35:03.87 ID:e39Fa4ck.net] あ、14だったw https://godbolt.org/z/fcPT6jjhf
503 名前:デフォルトの名無しさん mailto:sage [2022/03/13(日) 21:37:39.20 ID:e39Fa4ck.net] gccは9でデフォルト(c++14)指定でも再現しない