C++相談室 part154
■ このスレッドは過去ログ倉庫に格納されています
確かにideoneでもVS2019でも両方エラーになるのですだが、 1番目の例はVS2010ではビルドも通って動くもーん ソース: https://ideone.com/DC8fMv 実行結果(※ VS2010限定): 1: 100 続行するには何かキーを押してください . . . ちな関数テンプレートfoo()の定義をusingよりも後方にしたら全てでビルドが通って動く まそりゃーそうならないとおかしいが >>716 > >>714 > 通ってねえじゃん > 何が言いたいんだ? ※ VS2010限定 だから何? ill-formedなのがわかっても自分が正しいと強弁したいのか? 全員の主張を再検証しただけでつよ? >原文のままでは>>711 が言うとおり通るわけがない (>>712 ) が覆されてご機嫌ななめ?? 覆った? おまえVS2010限定で逃げただろ ill-formedはill-formed これを覆せたら出直して来な 俺も昔のバージョンのコンパイラは使うがバグ技は使わないし そういうことをする厨二病とは組みたくない >おまえVS2010限定で逃げただろ VS2010ではビルドが通るというのが話の発端なので… 1番目の例がill-formedであろう点は同意 orzなんだろ 何が誰が悪いのかわかったら素直になれよ 居直る態度が気に入らねえ 何が悪いのか、はともかく 誰が悪いのかとは一体… つか現象(事実)の提示に対してそれを反発と解釈して勝手に炎上しないでいただきたい;;; 個人的にはVS2010のバグである可能性でほぼ確定とは思いつつ、 例1と例2で動きが違うことから、MSVC2010は、グローバルなシンボルについて template foo()や関数baz()の中の解釈に入る前に名前空間を確定させる実装なのだと感じる (template foo()の解釈ロジック自体にバグがあるなら例1、2とも同じ結果になるのが自然 再発防止のためには、C++規格のどこをどう読めば良いんじゃorz >>719 は明らかに煽り口調だろうが 和解したいなら、あの態度を撤回しろ 俺は和解なんかできなくて構わんが 匿名掲示板で誰が何を言ったのどうのとみっともないぞデフォルトの名無しさんよ どう見ても>>716 がイミフな言いがかりつけてるだけにしか見えんが… > 確かにideoneでもVS2019でも両方エラーになるのですだが、 > 1番目の例はVS2010ではビルドも通って動くもーん 匿名でも江副とかQZとか片山やはちみつが糞なのは伝わってくるω どこでも動くように標準化しましょうねって話だよね。 G++とかclang++などの複数のコンパイラで警告最大にして自動ビルドすれば再発防止できると思われます。 流れをぶった切って質問です。 あるクラスで生成、削除を一切合切プライベートにしたい(ファクトリメソッドでスマートポインタを渡す)んだけど、 ::deleteを対象クラスだけプライベート、あるいはコンパイルエラーにする ことって可能かしらん? dtorはデストラクターの略ね。 死のトラクターじゃないよ。 >>728 私が馬鹿なのは私自身が認めていることですが、片山さんはすごいと思いますよ、何よりも片山さんは多産ですし、私は片山さんを尊敬しています‥‥ >>733 ありがとう。参考になりました。 流石にグローバルdtorの直接呼び出しを気にしている人は居なさそうですね。 通常の使い方じゃないから気にするな、が正解かしらん。 つかprivate dtorって何の解決にもなって なくね? クラスFooのデストラがprivateな時点で Fooのfirendでも何でもないstd::shared_ptr<Foo>はビルドエラーになる宿命なのでは… あとp.get()->Delete()とされるのも恐ろしいすぐる……… >>739 そのあたりは回避策ある。 どのwebページに解説あったか覚えてないけど…… operator <=>を定義しても ==と!=が使えるようにならないのは、なんで? >>745 二項関係で、反射律、推移律、比較可能性を満たすもの >>746 擬順序とか半順序と呼ぶ本もありますね、 ただ、その「比較可能性を満たす」とはなんでしょうか?私の教科書では、擬順序には反射律・推移律だけしか要請されていなかったと記憶しているのですが? 普通に言葉通り任意の2つの元を比較できるということなのでは… 木構造で「親は子より大きい」という順序を定義しただけ (全順序集合(例えば整数)で全ノードをラベル付けしてしまうというチート手段に訴えことなく、 文字通り「if (aはbの親) { a > b; }」という規則と(a, b)の反射律、推移律を導入しただけ では兄弟間の大小が定まらない、 みたいな なお{ 全順序集合 }⊂{ 半順序集合 }なのは確定的に明らかなので、 反射律・推移律だけしか要請されていなかったらそれは全順序集合の集合を含む半順序集合の集合の意味となりぬ つまり全順序集合の集合と半順序集合の集合が区別できん 両社を区別したい議論のときは比較可能性の有無を宣明せねばならんぬ、 a≦b または b≦aが成り立つ時、比較可能 弱順序ってしらなかったけど、半順序とは違うようだ 「半順序?弱順序?二項関係・順序関係まとめ」って記事 束論やってるけど弱順序とか初めて聞いた… マ界用語? 弱順序は、半順序よりは制限強いが全順序より弱いもので、 ある種のソートアルゴリズムでは全順序よりは制限緩められるけど 半順序までは緩められない、ってのがあるみたいね アルゴリズムとの関連はちょっとわからんけど 数学としての束論って単独の本は少なくて、代数学の本に載ってるんじゃないかな もしくは順序集合の話として集合論の本 >>748 >普通に言葉通り任意の2つの元を比較できるということなのでは… いや、それは全順序ですよ ・擬順序 ・順序 これらの演算子を≦としたとき、かならずしも任意の二元 a, b について a ≦ b の真偽が定まらなくてもいいと思います 擬順序に対して「a ≦ b かつ b ≦ a ならば a = b」という縛りが追加されるのが順序、 順序に対して、任意の二元 a, b について「a ≦ b」または「b ≦ a」のどちらかである、という縛りが要請されるのが全順序 だったかと wikipediaの「推移関係」の項目より 半順序 - 反対称的な擬順序 擬順序 - 推移的であると同時に反射的 全擬順序 - 完全的な擬順序 同値関係 - 対称的な擬順序 厳密弱順序 - 強半順序関係で等価関係での比較が不可能な場合 全順序 - 推移的で反対称的な完全関係 全順序、半順序くらいしか知らんかった OOPの本だとサブクラス関係は前順序って書いてるよな?擬順序ともいうのか 推移的、A→B∧B→C |- A→C 、サブクラスのサブクラスはサブクラス かつ反射的、AはAのサブクラス >>757 >いや、それは全順序ですよ は? その条件が共通なだけだろ >>760 一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいいのですよ すべての二項間で順序の真偽が定まるのは、順序の中でも一番強いものである全順序で初めて導入される、と私は解釈しています ブール代数 型システムで検索しても出てこないけど>>523 可補分配束の定義見てると確かにそんな気はしてくる インスタンス関係かサブクラス関係なのか?どっちでも成り立ちそうだけど、取り敢えず静的チェックをパスすることを考える 要素が無いと言う意味でCのvoidを冪集合ブール代数の最小元、空集合とみなす void *は何でも指せるという意味で最大元 まともな型システムなら(少なくとも)上記の擬順序以上は要求る 演算は多重継承とvirtual 定義が∨/∧に対応?クラス図書いてみたら成り立ちそうに思える 型チェック通らない全ての型を考えられるし、それが¬ 型述語で定義してればそのまま!演算子になる 確証が持てなくてもどかしい…数学できる人ツッコミ待ち とりあえずダイヤモンド継承を許さない言語だと、常に∧/∨は定義されないからブール代数にはならない事には気付いた ググってる時点で、というかそのことを隠しもしないニワカ >>764 隠して5chなんかで偉ぶってどうすんのさ 質問ですがムーブコンストラクタを有する基底クラスの 派生クラスでムーブコンストラクタを 派生クラスがムーブコンストラクトされる際に基底クラスにアクセスしようとする場合であっても 安全に書く方法って何かあるんでしたっけ 作ったクラスをmapにいれるときoperator<を書かなきゃいけないのがめんどい あとムーブコンストラクタを有するクラスを 詳細を隠ぺいする目的でインターフェースを設けたとき インターフェース経由でムーブコンストラクトする方法って何かあるんでしたっけ アブストラクトファクトリイーを作るしか無い? この場合アブストラクトファクトリイーといっても、元のクラスFooに対して IFoo IFoo::move() { ... } が定義してあって IFoo x = (適当な生成手段) ののち、 IFoo y = x.move() でxが破壊されるやつ! 領域が連続しているコンテナなら何でも良いんですが、たとえば array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって memcpy(b.data(), a.data(), n*sezeof(T)) で良いんですかね? UNIXコマンドと順番が違ったりして間違えそうなのですが、他に良いやり方ありますか >>771 領域確保されてるならたぶんそれが最速だけど、普通はstd::copyかな >>761 その「一番弱い」とか言ってるのは前順序だろ。 ククク... 前順序は順序四天王の中でも最弱... ウィキペディアにも書いてあるのに間違うとは面汚しよ... 半順序とかいう訳が悪い 英語のpartial orderの方が分かりやすい >>774 本によって用語にブレがあるのは数学では常識でしょう?だから>>761 では定義もあわせて書いておきました あとは裁判で争うしかないでしょうね。 我々には判決が出せませんから。 >>771 前提条件として ・ T の型が trivially copyable である ・ vector の大きさが必要な大きさ分に出来ている ならそれでもいいよ。 でも、 C の関数を C++ でも使えるのはほとんどが互換性のためでしかなく、 作法的にはあまり使わないに越したことは無いって感じ。 >>771 >>778 と思ったけど、 vector<T> ではなくて vector< vector<T> > なのか。 それだと領域が連続するという前提が成り立たないんじゃないんですかね。 >>770 どういう意味じゃ… ムーブコンストラクトする手段をインターフェースとして公開したい需要は論理的に有り得る それともIFoo::move()に実装が伴うからという意味? >>779 なぜ? 行優先か列優先かは置いといて、vectorの要素は連続するのだからvectorのvectorも連続するのでは? サイズやキャパシティが変わったときに不連続になりうるということ? vectorのvectorの中身はサイズ値とバッファポインタが連続で並んでるだろうな >>781 正しくコピーしたければ、 memcpy(b[0].data(), ...) みたいにしないと。 このとき当然b[1]のデータ領域はb[0]の後ろに連続していない >>781 vector 型のオブジェクトが連続して並んでいることは保証されるよ。 でも vector 型のオブジェクトのメモリレイアウトがどうなってるかは保証されない。 常識的な実装は >>782 が言う通りヒープから持ってきたメモリのポインタなどを持ってるだけ。 データそのものを内包しているわけではない。 ほらCと同じ基本の部分を教えずにいきなりSTLとか勧めるからこういう初心者が出てくる・・ ある程度出てきても問題ないだろ。ちゃんとドキュメント読んで理解してくれる人も多いんだろうし、 「Cと同じ基本の部分」を教えたところでちゃんと理解してくれない人も居るだろうし。 >>771 > array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって > memcpy(b.data(), a.data(), n*sezeof(T)) > で良いんですかね? 待てよ、b.data()って&b[0]だから型はvector<T>*だろ。書き換えたらいけないアドレスじゃん。 ダメです。 C++のvectorでは、演算子[ ]がオーバーロードされてるから、C言語の常識が通用しないんだよ。 memcpyは危険な関数だから簡単にメモリー破壊できるんだよね。 std::vector v; int a = 5; memcpy(&v, &a, sizeof(a)); // vのメモリー破壊。 >>791 流石にそれは質問者のレベルにも達してないんで問題外 別にここで何が正しいかを結論できなくてもいいのだが >>776 そう言うなら「推移的かつ反射的であるのみの順序関係」が「弱順序」と書いてある本を 教えてくれる? 手元になかったらうろ覚えでもいいけど。〇〇の××先生がそう言ってたみたいのでもいいw 知識として一応確認しておきたいかなと。 >>793 >>761 では「推移的かつ反射的であるのみの順序関係が『弱順序』」とはいっていませんよ、よく読んでくださいね >>761 で言っているのは「一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいい」としかいっていませんですよね‥‥ 曲解もはなはだしいと思いますね ちなみに私の教科書ではこれを「擬順序」と定義しています、大熊正氏の本ですが、私には一生かかっても私には読めないでしょうから、あとはググってください std::vector v(sizeof(int)); int a = 5; memcpy(&(v[0]), &a, sizeof(a)); // おk つかこうかorz std::vector<int> v((size_t)1); const int a = 5; memcpy_s(&(v[0]), sizeof(v[0]) * v.size(), &a, sizeof(a)); この場合は素直にループを書くか、それとも格好良くstd::copy使うのが楽かな。 条件を満たすならmemcpyのほうが圧倒的に早いからな それほど速くならない・速くなくていい場合のほうが圧倒的に多いってのもあるけどな。 >>780 IFooっていう名前からしてインターフェースってJava/C#的な意味でのそれだと思ってたけど それならポインタなり参照なりじゃないと機能してないよっていうかコンパイルエラーでしょってツッコミ メモリコピーを最適化する前に、他にすべきこと沢山あるだろ的な答えになるよな、確かに。 PG界の真理情報だわ。 >>802 オブジェクトAがconstメンバとして保持しているブツの所有権を移してオブジェクトBを構築することは ムーブコンストラクタでないと_なのでムーブコンストラクタである必要があり この要請はオブジェクト全体が直接アクセスかポインタや参照経由の間接アクセスかとは独立愚連隊、 >>803 真に高速化を求められる内側のループでstd::vector<int> xとかしないから >>796 はひとつながりの省略のないコードとして読んだら判断を誤りうる じゃなかったorz Foo::Foo(const Foo& src) { (srcを変更して新しいインスタンスを初期化) } はconst_cast<Foo>的な危険手段でないとやれないが Foo::Foo(Foo& src) { (srcを変更して新しいインスタンスを初期化) } とするとなんかコンパイラが警告を出すから Foo::Foo(Foo&& src) { (srcを変更して新しいインスタンスを初期化) } にせざるおえないという、 こういう馬鹿にはちゃんとベンチマークとれって言ってやるのが正しい行い。 >>805 そんなこと聞いてるんじゃなくて 提示されたコード片じゃどう考えても動かないから何したいか分からんのよ https://wandbox.org/permalink/ancQey3IkQKyWsu1 こっから始めてどこをどうしたいか教えてくれ 過疎ってるし、初心者どころかJavaの質問でもOKでは? >>807 この質問に対して回答をつける用意がありますが、しばしお待ちを ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる