[過去ログ] C++相談室 part154 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
706: 2021/02/11(木)20:23 ID:nDjPJyoP(1) AAS
>>704
returnで良いと思うよ。
707(1): 2021/02/11(木)20:50 ID:Iq2aKjep(5/5) AAS
>>701
680は俺だが何言ってんの?
708(2): 2021/02/11(木)21:58 ID:bviF/sLG(1/2) AAS
Visual Studio 2010(MSVC2010)で
template<class T>
void foo(T x) {
printf("%d: %d\n", targetEntity, x);
}
という関数テンプレートが定義されているときに、
namespace bar { const int targetEntity = 1; }
using bar::targetEntity;
void baz() { foo(100); }
はコンパイルが通るのに、
namespace bar { const int targetEntity = 1; }
void baz() {
using bar::targetEntity;
foo(100);
}
だと
error C2065: 'targetEntity': 定義されていない識別子です。
と言われるorz
709: 2021/02/11(木)22:06 ID:bviF/sLG(2/2) AAS
>>688
for_eachを勘違いいてたわサーセン、
確かにfor_each<bgn, end, Function>のFunction(*it)からならreturnするで良さげ
710: 2021/02/11(木)23:28 ID:Ooe4jkn9(1) AAS
>>707
アンパンマンはキミだ。
711(2): はちみつ餃子 ◆8X2XSCHEME 2021/02/12(金)01:36 ID:2OOQ6m86(1) AAS
>>708
宣言の有効範囲は宣言された場所からその宣言を含むブロックの終わりまでというのが原則
(クラススコープなどの例外はあるのでその他にも関連するルールはあるかもしれんけど)
なのでどちらもエラーになるのが筋だと思うし、 gcc や clang で試したらどっちもエラーだった。
逆にどういう理屈で前者が通るのかは気になる。
712(1): 2021/02/12(金)06:02 ID:45Tu3B4L(1/9) AAS
>>708
当たり前だね
最初の例ではtargetEntryをグローバル空間に導入しているからbaz()とfoo()の両方から見える
2番目の例ではtargetEntryをbaz()のブロック内に導入しているから、そこに包含されないfoo()のブロックからは見えない
ただし、これはfoo()を関数原型と関数定義に分けて関数定義をbarよりも後方に置いた場合の話だ
原文のままでは>>711が言うとおり通るわけがない
713: 2021/02/12(金)06:03 ID:45Tu3B4L(2/9) AAS
- barよりも後方
+ usingよりも後方
714(2): 2021/02/12(金)07:01 ID:3x5iWh5q(1/6) AAS
確かにideoneでもVS2019でも両方エラーになるのですだが、
1番目の例はVS2010ではビルドも通って動くもーん
ソース:
外部リンク:ideone.com
実行結果(※ VS2010限定):
1: 100
続行するには何かキーを押してください . . .
715: 2021/02/12(金)07:04 ID:3x5iWh5q(2/6) AAS
ちな関数テンプレートfoo()の定義をusingよりも後方にしたら全てでビルドが通って動く
まそりゃーそうならないとおかしいが
716(2): 2021/02/12(金)07:12 ID:45Tu3B4L(3/9) AAS
>>714
通ってねえじゃん
何が言いたいんだ?
717: 2021/02/12(金)07:17 ID:3x5iWh5q(3/6) AAS
>>716
> >>714
> 通ってねえじゃん
> 何が言いたいんだ?
※ VS2010限定
718: 2021/02/12(金)07:24 ID:45Tu3B4L(4/9) AAS
だから何?
ill-formedなのがわかっても自分が正しいと強弁したいのか?
719(1): 2021/02/12(金)07:27 ID:3x5iWh5q(4/6) AAS
全員の主張を再検証しただけでつよ?
>原文のままでは>>711が言うとおり通るわけがない (>>712)
が覆されてご機嫌ななめ??
720: 2021/02/12(金)07:32 ID:45Tu3B4L(5/9) AAS
覆った?
おまえVS2010限定で逃げただろ
ill-formedはill-formed
これを覆せたら出直して来な
721: 2021/02/12(金)07:34 ID:45Tu3B4L(6/9) AAS
俺も昔のバージョンのコンパイラは使うがバグ技は使わないし
そういうことをする厨二病とは組みたくない
722: 2021/02/12(金)07:38 ID:3x5iWh5q(5/6) AAS
>おまえVS2010限定で逃げただろ
VS2010ではビルドが通るというのが話の発端なので…
1番目の例がill-formedであろう点は同意
723: 2021/02/12(金)07:51 ID:45Tu3B4L(7/9) AAS
orzなんだろ
何が誰が悪いのかわかったら素直になれよ
居直る態度が気に入らねえ
724: 2021/02/12(金)08:12 ID:3x5iWh5q(6/6) AAS
何が悪いのか、はともかく
誰が悪いのかとは一体…
つか現象(事実)の提示に対してそれを反発と解釈して勝手に炎上しないでいただきたい;;;
個人的にはVS2010のバグである可能性でほぼ確定とは思いつつ、
例1と例2で動きが違うことから、MSVC2010は、グローバルなシンボルについて
template foo()や関数baz()の中の解釈に入る前に名前空間を確定させる実装なのだと感じる
(template foo()の解釈ロジック自体にバグがあるなら例1、2とも同じ結果になるのが自然
再発防止のためには、C++規格のどこをどう読めば良いんじゃorz
725: 2021/02/12(金)08:57 ID:45Tu3B4L(8/9) AAS
>>719は明らかに煽り口調だろうが
和解したいなら、あの態度を撤回しろ
俺は和解なんかできなくて構わんが
726: 2021/02/12(金)10:26 ID:1W1GlA05(1) AAS
匿名掲示板で誰が何を言ったのどうのとみっともないぞデフォルトの名無しさんよ
727: 2021/02/12(金)11:29 ID:jxDcSv/l(1) AAS
どう見ても>>716がイミフな言いがかりつけてるだけにしか見えんが…
> 確かにideoneでもVS2019でも両方エラーになるのですだが、
> 1番目の例はVS2010ではビルドも通って動くもーん
728(1): 2021/02/12(金)13:22 ID:x9NfpsA7(1) AAS
匿名でも江副とかQZとか片山やはちみつが糞なのは伝わってくるω
729: 2021/02/12(金)18:24 ID:45Tu3B4L(9/9) AAS
単発IDになりやがった
どこまでも腐ってやがるな
730: 蟻人間 ◆T6xkBnTXz7B0 2021/02/12(金)19:12 ID:fTOQtm+W(1/2) AAS
どこでも動くように標準化しましょうねって話だよね。
731: 蟻人間 ◆T6xkBnTXz7B0 2021/02/12(金)19:29 ID:WC9JZZt5(1/2) AAS
G++とかclang++などの複数のコンパイラで警告最大にして自動ビルドすれば再発防止できると思われます。
732(1): 2021/02/12(金)19:37 ID:3abO7oQ0(1) AAS
流れをぶった切って質問です。
あるクラスで生成、削除を一切合切プライベートにしたい(ファクトリメソッドでスマートポインタを渡す)んだけど、
::deleteを対象クラスだけプライベート、あるいはコンパイルエラーにする
ことって可能かしらん?
733(1): 蟻人間 ◆T6xkBnTXz7B0 2021/02/12(金)19:46 ID:WC9JZZt5(2/2) AAS
>>732
private dtor使え、だとよ。
外部リンク:stackoverflow.com
734: 蟻人間 ◆T6xkBnTXz7B0 2021/02/12(金)19:55 ID:fTOQtm+W(2/2) AAS
dtorはデストラクターの略ね。
死のトラクターじゃないよ。
735: 2021/02/13(土)02:57 ID:ZCgeuP6g(1) AAS
映画化決定。
736: ◆QZaw55cn4c 2021/02/15(月)00:20 ID:M7Hs01/T(1) AAS
>>728
私が馬鹿なのは私自身が認めていることですが、片山さんはすごいと思いますよ、何よりも片山さんは多産ですし、私は片山さんを尊敬しています‥‥
737: 2021/02/15(月)12:30 ID:tZ1nblID(1) AAS
>>733
ありがとう。参考になりました。
流石にグローバルdtorの直接呼び出しを気にしている人は居なさそうですね。
通常の使い方じゃないから気にするな、が正解かしらん。
738: 2021/02/16(火)18:45 ID:zTH+X1Xm(1/2) AAS
画像
画像リンク[jpg]:genkibox.com
739(1): 2021/02/16(火)18:59 ID:zTH+X1Xm(2/2) AAS
つかprivate dtorって何の解決にもなって
なくね?
クラスFooのデストラがprivateな時点で
Fooのfirendでも何でもないstd::shared_ptr<Foo>はビルドエラーになる宿命なのでは…
あとp.get()->Delete()とされるのも恐ろしいすぐる………
740: 2021/02/16(火)19:15 ID:Pme6j5oX(1) AAS
>>739
そのあたりは回避策ある。
どのwebページに解説あったか覚えてないけど……
741(1): 2021/02/17(水)08:24 ID:Pn/OWNHb(1) AAS
operator <=>を定義しても
==と!=が使えるようにならないのは、なんで?
742(1): 2021/02/17(水)11:29 ID:u6Au0MiC(1) AAS
外部リンク[html]:cpprefjp.github.io
のoperator==節で仕様とその理由についても説明してあります
743: 2021/02/17(水)12:05 ID:8kTif7Fu(1) AAS
relops
744: 2021/02/17(水)12:07 ID:ZhVk2C4b(1/4) AAS
relops
745(1): 2021/02/17(水)12:14 ID:7xS0C1vs(1) AAS
なるほどわからん。弱順序って何よ?
746(1): 2021/02/17(水)13:36 ID:peDNmUYI(1) AAS
>>745
二項関係で、反射律、推移律、比較可能性を満たすもの
747: ◆QZaw55cn4c 2021/02/17(水)21:10 ID:n4obO1jB(1) AAS
>>746
擬順序とか半順序と呼ぶ本もありますね、
ただ、その「比較可能性を満たす」とはなんでしょうか?私の教科書では、擬順序には反射律・推移律だけしか要請されていなかったと記憶しているのですが?
748(1): 2021/02/17(水)23:46 ID:ZhVk2C4b(2/4) AAS
普通に言葉通り任意の2つの元を比較できるということなのでは…
木構造で「親は子より大きい」という順序を定義しただけ
(全順序集合(例えば整数)で全ノードをラベル付けしてしまうというチート手段に訴えことなく、
文字通り「if (aはbの親) { a > b; }」という規則と(a, b)の反射律、推移律を導入しただけ
では兄弟間の大小が定まらない、
みたいな
749: 2021/02/17(水)23:47 ID:ZhVk2C4b(3/4) AAS
のは半順序で、
整数みたいなやつが全順序
750: 2021/02/17(水)23:59 ID:ZhVk2C4b(4/4) AAS
なお{ 全順序集合 }⊂{ 半順序集合 }なのは確定的に明らかなので、
反射律・推移律だけしか要請されていなかったらそれは全順序集合の集合を含む半順序集合の集合の意味となりぬ
つまり全順序集合の集合と半順序集合の集合が区別できん
両社を区別したい議論のときは比較可能性の有無を宣明せねばならんぬ、
751: 2021/02/18(木)00:34 ID:48a8FzyN(1/3) AAS
a≦b または b≦aが成り立つ時、比較可能
弱順序ってしらなかったけど、半順序とは違うようだ
「半順序?弱順序?二項関係・順序関係まとめ」って記事
752(1): 2021/02/18(木)03:35 ID:sRdwF113(1) AAS
束論やってるけど弱順序とか初めて聞いた…
マ界用語?
753: 741 2021/02/18(木)06:50 ID:brZHVFLx(1) AAS
>>742
まだ何とも言えないが
thx!
754: 2021/02/18(木)10:08 ID:48a8FzyN(2/3) AAS
弱順序は、半順序よりは制限強いが全順序より弱いもので、
ある種のソートアルゴリズムでは全順序よりは制限緩められるけど
半順序までは緩められない、ってのがあるみたいね
755: 2021/02/18(木)13:16 ID:9Yl3mCZH(1) AAS
>>752
束って何で勉強すればいいん?
756: 2021/02/18(木)14:43 ID:48a8FzyN(3/3) AAS
アルゴリズムとの関連はちょっとわからんけど
数学としての束論って単独の本は少なくて、代数学の本に載ってるんじゃないかな
もしくは順序集合の話として集合論の本
757(1): ◆QZaw55cn4c 2021/02/19(金)04:42 ID:3tFNJrqv(1/2) AAS
>>748
>普通に言葉通り任意の2つの元を比較できるということなのでは…
いや、それは全順序ですよ
・擬順序
・順序
これらの演算子を≦としたとき、かならずしも任意の二元 a, b について a ≦ b の真偽が定まらなくてもいいと思います
擬順序に対して「a ≦ b かつ b ≦ a ならば a = b」という縛りが追加されるのが順序、
順序に対して、任意の二元 a, b について「a ≦ b」または「b ≦ a」のどちらかである、という縛りが要請されるのが全順序
だったかと
758: 2021/02/19(金)20:38 ID:mpGE+xsF(1) AAS
wikipediaの「推移関係」の項目より
半順序 - 反対称的な擬順序
擬順序 - 推移的であると同時に反射的
全擬順序 - 完全的な擬順序
同値関係 - 対称的な擬順序
厳密弱順序 - 強半順序関係で等価関係での比較が不可能な場合
全順序 - 推移的で反対称的な完全関係
全順序、半順序くらいしか知らんかった
759: 2021/02/19(金)20:51 ID:gWMDVcMR(1/4) AAS
OOPの本だとサブクラス関係は前順序って書いてるよな?擬順序ともいうのか
推移的、A→B∧B→C |- A→C 、サブクラスのサブクラスはサブクラス
かつ反射的、AはAのサブクラス
760(1): 2021/02/19(金)20:55 ID:fAhRarpN(1) AAS
>>757
>いや、それは全順序ですよ
は? その条件が共通なだけだろ
761(3): ◆QZaw55cn4c 2021/02/19(金)21:23 ID:3tFNJrqv(2/2) AAS
>>760
一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいいのですよ
すべての二項間で順序の真偽が定まるのは、順序の中でも一番強いものである全順序で初めて導入される、と私は解釈しています
762: 2021/02/19(金)21:44 ID:gWMDVcMR(2/4) AAS
ブール代数 型システムで検索しても出てこないけど>>523
可補分配束の定義見てると確かにそんな気はしてくる
インスタンス関係かサブクラス関係なのか?どっちでも成り立ちそうだけど、取り敢えず静的チェックをパスすることを考える
要素が無いと言う意味でCのvoidを冪集合ブール代数の最小元、空集合とみなす
void *は何でも指せるという意味で最大元
まともな型システムなら(少なくとも)上記の擬順序以上は要求る
演算は多重継承とvirtual 定義が∨/∧に対応?クラス図書いてみたら成り立ちそうに思える
型チェック通らない全ての型を考えられるし、それが¬
型述語で定義してればそのまま!演算子になる
763: 2021/02/19(金)21:55 ID:gWMDVcMR(3/4) AAS
確証が持てなくてもどかしい…数学できる人ツッコミ待ち
とりあえずダイヤモンド継承を許さない言語だと、常に∧/∨は定義されないからブール代数にはならない事には気付いた
764(1): 2021/02/19(金)21:55 ID:hHLb88jw(1) AAS
ググってる時点で、というかそのことを隠しもしないニワカ
765: 2021/02/19(金)21:56 ID:gWMDVcMR(4/4) AAS
>>764
隠して5chなんかで偉ぶってどうすんのさ
766: 2021/02/19(金)22:01 ID:aORwmd7L(1/3) AAS
質問ですがムーブコンストラクタを有する基底クラスの
派生クラスでムーブコンストラクタを
派生クラスがムーブコンストラクトされる際に基底クラスにアクセスしようとする場合であっても
安全に書く方法って何かあるんでしたっけ
767: 2021/02/19(金)22:03 ID:6z9jMlRH(1) AAS
作ったクラスをmapにいれるときoperator<を書かなきゃいけないのがめんどい
768: 2021/02/19(金)22:08 ID:aORwmd7L(2/3) AAS
あとムーブコンストラクタを有するクラスを
詳細を隠ぺいする目的でインターフェースを設けたとき
インターフェース経由でムーブコンストラクトする方法って何かあるんでしたっけ
アブストラクトファクトリイーを作るしか無い?
769: 2021/02/19(金)22:11 ID:aORwmd7L(3/3) AAS
この場合アブストラクトファクトリイーといっても、元のクラスFooに対して
IFoo IFoo::move() { ... } が定義してあって
IFoo x = (適当な生成手段)
ののち、
IFoo y = x.move()
でxが破壊されるやつ!
770(2): 2021/02/19(金)22:36 ID:F7SsNRLa(1) AAS
それインターフェースとして使えてないよ
771(5): 2021/02/20(土)00:40 ID:iK8Sr3o/(1) AAS
領域が連続しているコンテナなら何でも良いんですが、たとえば array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
memcpy(b.data(), a.data(), n*sezeof(T))
で良いんですかね?
UNIXコマンドと順番が違ったりして間違えそうなのですが、他に良いやり方ありますか
772: 2021/02/20(土)01:38 ID:YJV0xwOV(1) AAS
>>771
ド素人かよ
773: 2021/02/20(土)01:42 ID:upzAgg50(1/2) AAS
>>771
領域確保されてるならたぶんそれが最速だけど、普通はstd::copyかな
774(1): 2021/02/20(土)08:11 ID:BRyl48dG(1) AAS
>>761
その「一番弱い」とか言ってるのは前順序だろ。
ククク... 前順序は順序四天王の中でも最弱...
ウィキペディアにも書いてあるのに間違うとは面汚しよ...
775: 2021/02/20(土)11:17 ID:ZF+WEG2v(1/3) AAS
半順序とかいう訳が悪い
英語のpartial orderの方が分かりやすい
776(1): ◆QZaw55cn4c 2021/02/20(土)11:27 ID:mkFIMg3t(1/2) AAS
>>774
本によって用語にブレがあるのは数学では常識でしょう?だから>>761 では定義もあわせて書いておきました
777: 2021/02/20(土)11:30 ID:ec7b4JGn(1) AAS
あとは裁判で争うしかないでしょうね。
我々には判決が出せませんから。
778(1): はちみつ餃子 ◆8X2XSCHEME 2021/02/20(土)11:52 ID:N5IkYQZo(1/4) AAS
>>771
前提条件として
・ T の型が trivially copyable である
・ vector の大きさが必要な大きさ分に出来ている
ならそれでもいいよ。
でも、 C の関数を C++ でも使えるのはほとんどが互換性のためでしかなく、
作法的にはあまり使わないに越したことは無いって感じ。
779(1): はちみつ餃子 ◆8X2XSCHEME 2021/02/20(土)11:56 ID:N5IkYQZo(2/4) AAS
>>771
>>778
と思ったけど、 vector<T> ではなくて vector< vector<T> > なのか。
それだと領域が連続するという前提が成り立たないんじゃないんですかね。
780(1): 2021/02/20(土)12:51 ID:K0wy5MAI(1/3) AAS
>>770
どういう意味じゃ…
ムーブコンストラクトする手段をインターフェースとして公開したい需要は論理的に有り得る
それともIFoo::move()に実装が伴うからという意味?
781(2): 2021/02/20(土)14:23 ID:XZPJJfWU(1) AAS
>>779
なぜ?
行優先か列優先かは置いといて、vectorの要素は連続するのだからvectorのvectorも連続するのでは?
サイズやキャパシティが変わったときに不連続になりうるということ?
782(1): 2021/02/20(土)14:39 ID:ZF+WEG2v(2/3) AAS
vectorのvectorの中身はサイズ値とバッファポインタが連続で並んでるだろうな
783: 2021/02/20(土)14:57 ID:upzAgg50(2/2) AAS
>>781
正しくコピーしたければ、
memcpy(b[0].data(), ...)
みたいにしないと。
このとき当然b[1]のデータ領域はb[0]の後ろに連続していない
784: はちみつ餃子 ◆8X2XSCHEME 2021/02/20(土)15:27 ID:N5IkYQZo(3/4) AAS
>>781
vector 型のオブジェクトが連続して並んでいることは保証されるよ。
でも vector 型のオブジェクトのメモリレイアウトがどうなってるかは保証されない。
常識的な実装は >>782 が言う通りヒープから持ってきたメモリのポインタなどを持ってるだけ。
データそのものを内包しているわけではない。
785: 2021/02/20(土)16:22 ID:UDAFNKrx(1/2) AAS
ほらCと同じ基本の部分を教えずにいきなりSTLとか勧めるからこういう初心者が出てくる・・
786: 2021/02/20(土)17:06 ID:1TZxH4Mg(1) AAS
ある程度出てきても問題ないだろ。ちゃんとドキュメント読んで理解してくれる人も多いんだろうし、
「Cと同じ基本の部分」を教えたところでちゃんと理解してくれない人も居るだろうし。
787: 2021/02/20(土)17:09 ID:UDAFNKrx(2/2) AAS
ちょっと何言ってるかわかんない
788(1): 2021/02/20(土)17:54 ID:ZF+WEG2v(3/3) AAS
相談室に初心者が来て何の問題があるのか
789: はちみつ餃子 ◆8X2XSCHEME 2021/02/20(土)18:06 ID:N5IkYQZo(4/4) AAS
>>788
程度による。
790: 蟻人間 ◆T6xkBnTXz7B0 2021/02/20(土)19:27 ID:VmESNyRi(1) AAS
>>771
> array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
> memcpy(b.data(), a.data(), n*sezeof(T))
> で良いんですかね?
待てよ、b.data()って&b[0]だから型はvector<T>*だろ。書き換えたらいけないアドレスじゃん。
ダメです。
791(1): 蟻人間 ◆T6xkBnTXz7B0 2021/02/20(土)19:49 ID:HfYkFRCd(1/2) AAS
C++のvectorでは、演算子[ ]がオーバーロードされてるから、C言語の常識が通用しないんだよ。
memcpyは危険な関数だから簡単にメモリー破壊できるんだよね。
std::vector v;
int a = 5;
memcpy(&v, &a, sizeof(a)); // vのメモリー破壊。
792: 2021/02/20(土)20:38 ID:PUIofNKd(1) AAS
>>791
流石にそれは質問者のレベルにも達してないんで問題外
793(1): 2021/02/20(土)20:44 ID:Rkd/h2tQ(1) AAS
別にここで何が正しいかを結論できなくてもいいのだが
>>776
そう言うなら「推移的かつ反射的であるのみの順序関係」が「弱順序」と書いてある本を
教えてくれる?
手元になかったらうろ覚えでもいいけど。〇〇の××先生がそう言ってたみたいのでもいいw
知識として一応確認しておきたいかなと。
794: ◆QZaw55cn4c 2021/02/20(土)21:19 ID:mkFIMg3t(2/2) AAS
>>793
>>761 では「推移的かつ反射的であるのみの順序関係が『弱順序』」とはいっていませんよ、よく読んでくださいね
>>761 で言っているのは「一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいい」としかいっていませんですよね‥‥
曲解もはなはだしいと思いますね
ちなみに私の教科書ではこれを「擬順序」と定義しています、大熊正氏の本ですが、私には一生かかっても私には読めないでしょうから、あとはググってください
795: 2021/02/20(土)21:44 ID:K0wy5MAI(2/3) AAS
std::vector v(sizeof(int));
int a = 5;
memcpy(&(v[0]), &a, sizeof(a)); // おk
796(1): 2021/02/20(土)21:47 ID:K0wy5MAI(3/3) AAS
つかこうかorz
std::vector<int> v((size_t)1);
const int a = 5;
memcpy_s(&(v[0]), sizeof(v[0]) * v.size(), &a, sizeof(a));
797: 蟻人間 ◆T6xkBnTXz7B0 2021/02/20(土)21:58 ID:HfYkFRCd(2/2) AAS
この場合は素直にループを書くか、それとも格好良くstd::copy使うのが楽かな。
798: 2021/02/21(日)01:26 ID:G4m9GHw4(1) AAS
for文回したら死ぬ病気にでもかかってんのか?
799: 2021/02/21(日)01:29 ID:oO8KGr2m(1) AAS
条件を満たすならmemcpyのほうが圧倒的に早いからな
800: はちみつ餃子 ◆8X2XSCHEME 2021/02/21(日)01:32 ID:jd0qgVVy(1/2) AAS
それほど速くならない・速くなくていい場合のほうが圧倒的に多いってのもあるけどな。
801: 2021/02/21(日)03:13 ID:ZrTKdY4P(1) AAS
そもそもそんなクソみたいなコードはふつう書かない
802(2): 770 2021/02/21(日)03:54 ID:HYHVDYIS(1/4) AAS
>>780
IFooっていう名前からしてインターフェースってJava/C#的な意味でのそれだと思ってたけど
それならポインタなり参照なりじゃないと機能してないよっていうかコンパイルエラーでしょってツッコミ
803(1): 2021/02/21(日)03:58 ID:0HHdBuLy(1) AAS
メモリコピーを最適化する前に、他にすべきこと沢山あるだろ的な答えになるよな、確かに。
PG界の真理情報だわ。
804: 2021/02/21(日)05:11 ID:L28MHLBD(1) AAS
valarrayでxorとか
805(1): 2021/02/21(日)07:43 ID:F92hI73d(1/6) AAS
>>802
オブジェクトAがconstメンバとして保持しているブツの所有権を移してオブジェクトBを構築することは
ムーブコンストラクタでないと?なのでムーブコンストラクタである必要があり
この要請はオブジェクト全体が直接アクセスかポインタや参照経由の間接アクセスかとは独立愚連隊、
>>803
真に高速化を求められる内側のループでstd::vector<int> xとかしないから
>>796はひとつながりの省略のないコードとして読んだら判断を誤りうる
806(1): 2021/02/21(日)07:51 ID:F92hI73d(2/6) AAS
じゃなかったorz
Foo::Foo(const Foo& src) { (srcを変更して新しいインスタンスを初期化) }
はconst_cast<Foo>的な危険手段でないとやれないが
Foo::Foo(Foo& src) { (srcを変更して新しいインスタンスを初期化) }
とするとなんかコンパイラが警告を出すから
Foo::Foo(Foo&& src) { (srcを変更して新しいインスタンスを初期化) }
にせざるおえないという、
807(3): 2021/02/21(日)13:21 ID:Dqlg3tSu(1) AAS
関数と関数オブジェクトってどう使い分けるの?
808: 2021/02/21(日)13:30 ID:YxY+Ievf(1) AAS
こういう馬鹿にはちゃんとベンチマークとれって言ってやるのが正しい行い。
809(1): 2021/02/21(日)14:32 ID:HYHVDYIS(2/4) AAS
>>805
そんなこと聞いてるんじゃなくて
提示されたコード片じゃどう考えても動かないから何したいか分からんのよ
外部リンク:wandbox.org
こっから始めてどこをどうしたいか教えてくれ
810: 2021/02/21(日)14:47 ID:9WgNecVw(1) AAS
404 Not Found
811: 2021/02/21(日)15:33 ID:HYHVDYIS(3/4) AAS
すまん
外部リンク:wandbox.org
812: 2021/02/21(日)16:21 ID:u2qGdVDT(1) AAS
過疎ってるし、初心者どころかJavaの質問でもOKでは?
813(2): ◆QZaw55cn4c 2021/02/21(日)19:01 ID:3Ebck9FU(1/4) AAS
>>807
この質問に対して回答をつける用意がありますが、しばしお待ちを
814(3): ◆QZaw55cn4c 2021/02/21(日)19:27 ID:3Ebck9FU(2/4) AAS
>>807,813
昔のコードを今読んでみたんですが、実のところ関数オブジェクトにする必要性があったかどうか、今の価値観のもとでは首をかしげています
数値計算のプログラムって、無自覚にバンバン書いてると例えばルンゲ食ったをやっているとこと他とかが混ざり合って収拾がつかなくなる、と思って関数オブジェクトにアイソレートした記憶があって、それを思い出して読んでみたんですけれども、今読んでみても、なんだか、ねえ‥‥
2chスレ:tech
815(1): 2021/02/21(日)20:07 ID:F92hI73d(3/6) AAS
>>809
Fooはこんなやつ、
外部リンク:ideone.com
IFooは、C++ではよく考えたらIFooのオブジェクトを直接生成できないので(>>802の仰せの通り
std::shared_ptr<IFoo>とかで生成することを考えたのだがエラーになるorz
(上のリンク先のコードでコメントアウトしてあるgenerate_IFoo()
思いのほか闇が深かった\(^o^)/
std::shared_ptr<IFoo>が生成できた暁には、
std::shared_ptr<IFoo> pがリソースの所有権を握ったFooを保持しているとき、
std::shared_ptr<IFoo> qというのがいるとして、
*q = *p
で所有権を*pから*qに渡したり、
return *p
で呼び出し元が所有権を有するFooを受け取れるようにしたいワケ
816: 2021/02/21(日)20:09 ID:F92hI73d(4/6) AAS
ちなみにWandboxでソースコードをフォークする方法は
初心者なので
わかり
ません
817(1): 2021/02/21(日)20:14 ID:LxNhpnKU(1/2) AAS
generate_Foo()がコケてるのはnewのところでFooのコピコンがないだけだろ
コピコン書くか、ムーコン使いたいならnew Foo(std::move(foo3))にすればいいだけ
後半も意味不明
*q = *pってそれスライシングだぞ
818(1): 2021/02/21(日)20:23 ID:F92hI73d(5/6) AAS
>>817
普通の(ムーブでない)コピコンは書けないなぜなら>>806の理由により
>*q = *pってそれスライシングだぞ
どゆこと?
Foo foo1とFoo foo2だと
foo1 = foo2
とできるのに、
819: 2021/02/21(日)20:26 ID:F92hI73d(6/6) AAS
ちょっと補足すると、IFooには現状代入手段が無いから、
*q = *pはそもそもコンパイルが通ることはなく、目的とする機能を形而上的に表す仮想コード
のつもり
820(3): 2021/02/21(日)21:03 ID:+My/Unlg(1) AAS
>>814
処理を意味でまとめるようなことなら積極的にやるべきだと思いますが、それは関数オブジェクトじゃなくて関数でもできますよね?
821: 2021/02/21(日)21:05 ID:HYHVDYIS(4/4) AAS
>>815
コピー代入演算子とムーブコンストラクタだけ定義するとか意味分からんし
インターフェースによる隠蔽より先にそっち解決しなさい
何がしたいのか自分で本当にわかってる?
822(2): ◆QZaw55cn4c 2021/02/21(日)21:07 ID:3Ebck9FU(3/4) AAS
>>820
まあ、そのとおりであり、そうなんですよね…
>>814 は関数オブジェクトである必然性はありません、関数オブジェクトを積極的に使う例としては STL にご登場願うしかないのかもしれませんね
823(1): 2021/02/21(日)22:29 ID:LxNhpnKU(2/2) AAS
>>818
shared_ptrは関係ないから普通のポインタで話するぞ(同じ事だ)
IFoo* p = new Foo();
IFoo* q = new Foo();
というのがあったとして*q = *p;ってのは何だと思う?
pとqはIFoo*型だ
だからもちろん*pと*qというのはIFoo型だ
すなわち*q = *p;というのはIFoo::operator=(const Foo&)の呼び出しだ
operator=()はvirtualにできないから、pとqが本当はFoo型オブジェクトを指してることなんか知りもしないし考慮もしない
よってIFoo部分の代入だけが行われて、要はqのIFoo部分だけが首チョンパされてpのIFoo部分が代入される
これをスライシングという
824(1): はちみつ餃子 ◆8X2XSCHEME 2021/02/21(日)23:00 ID:jd0qgVVy(2/2) AAS
>>822
関数オブジェクトに「関数」とついているのは関数と同じ記法で呼び出せるということに意味があって、インターフェイスの問題。
状態を持った関数 (関数オブジェクト) も状態を持たない関数 (関数ポインタ) も統一的に扱えたらうれしいねって話なので、
状態を持たず、高階関数に渡すこともない場合は関数オブジェクトにする意味はないな。
(普通の関数も static 変数への参照を持ってたりする場合もあるので必ずしも状態を持たないわけではないけど。)
825: ◆QZaw55cn4c 2021/02/21(日)23:42 ID:3Ebck9FU(4/4) AAS
>>824,820(>>813,814,822)
結局、どーでもいい一発芸で、ああ動くね‥‥、と思ったまま放置してましたね<関数オブジェクト
2chスレ:tech
外部リンク:ideone.com
あとはラムダ式の理解のための存在という認識、か
826: はちみつ餃子 ◆8X2XSCHEME 2021/02/22(月)00:10 ID:oiAqsUn6(1) AAS
「ラムダ式が関数オブジェクト (型の定義と生成) の構文糖」というのは
既存のプログラムとの整合性を壊さない上手いアイデアだと思うけど、
しばらくしたら「関数オブジェクトはラムダ式の実体」という説明のほうが
通りがよくなったりするかもしれないね。
827(1): 2021/02/22(月)04:39 ID:7qATnC1I(1/2) AAS
関数オブジェクトで状態を渡せるのは結構なんだが、コピーコンストラクタ渡しなので、
手の込んだ状態管理だった場合は結局、C言語と同じくユーザー定義変数を介して状態を読み書きすることになる。
828: 2021/02/22(月)08:23 ID:Dz0hZ3aS(1) AAS
>>827
shared_ptr使えば、大抵の場合は問題ないんじゃない?
829(3): 2021/02/22(月)09:54 ID:Y0MZ31oO(1) AAS
>>807,820ですけどQZで始まる人あまりにもレベル低いというか回答者として不適格だと思うのでNGします
830: 2021/02/22(月)10:22 ID:1euWwsnd(1) AAS
>>829
答えてもらってる立場で偉そうに。常識ないの?
831(2): 2021/02/22(月)11:11 ID:M+ptXBNl(1/3) AAS
いやでも実際・・・QZはね・・・
50過ぎのおっさんが無理して絡みにいってるけど空回りしてる感じなんだよね
ほんと残念だけども
832: 2021/02/22(月)11:36 ID:7qATnC1I(2/2) AAS
関数オブジェクトに対するラムダ式の優位性は、ローカル変数を比較的安全かつ手軽に参照渡しできることだろう。
上下前次1-新書関写板覧索設栞歴
あと 170 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.034s