X



C++相談室 part154
■ このスレッドは過去ログ倉庫に格納されています
0714デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:01:12.63ID:3x5iWh5q
確かにideoneでもVS2019でも両方エラーになるのですだが、
1番目の例はVS2010ではビルドも通って動くもーん

ソース:
https://ideone.com/DC8fMv

実行結果(※ VS2010限定):
1: 100
続行するには何かキーを押してください . . .
0715デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:04:11.00ID:3x5iWh5q
ちな関数テンプレートfoo()の定義をusingよりも後方にしたら全てでビルドが通って動く
まそりゃーそうならないとおかしいが
0719デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:27:26.57ID:3x5iWh5q
全員の主張を再検証しただけでつよ?
>原文のままでは>>711が言うとおり通るわけがない (>>712)
が覆されてご機嫌ななめ??
0720デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:32:07.63ID:45Tu3B4L
覆った?
おまえVS2010限定で逃げただろ
ill-formedはill-formed
これを覆せたら出直して来な
0721デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:34:53.80ID:45Tu3B4L
俺も昔のバージョンのコンパイラは使うがバグ技は使わないし
そういうことをする厨二病とは組みたくない
0722デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:38:38.54ID:3x5iWh5q
>おまえVS2010限定で逃げただろ
VS2010ではビルドが通るというのが話の発端なので…
1番目の例がill-formedであろう点は同意
0723デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:51:23.22ID:45Tu3B4L
orzなんだろ
何が誰が悪いのかわかったら素直になれよ
居直る態度が気に入らねえ
0724デフォルトの名無しさん
垢版 |
2021/02/12(金) 08:12:22.74ID:3x5iWh5q
何が悪いのか、はともかく
誰が悪いのかとは一体…
つか現象(事実)の提示に対してそれを反発と解釈して勝手に炎上しないでいただきたい;;;

個人的にはVS2010のバグである可能性でほぼ確定とは思いつつ、
例1と例2で動きが違うことから、MSVC2010は、グローバルなシンボルについて
template foo()や関数baz()の中の解釈に入る前に名前空間を確定させる実装なのだと感じる
(template foo()の解釈ロジック自体にバグがあるなら例1、2とも同じ結果になるのが自然

再発防止のためには、C++規格のどこをどう読めば良いんじゃorz
0725デフォルトの名無しさん
垢版 |
2021/02/12(金) 08:57:55.62ID:45Tu3B4L
>>719は明らかに煽り口調だろうが
和解したいなら、あの態度を撤回しろ

俺は和解なんかできなくて構わんが
0726デフォルトの名無しさん
垢版 |
2021/02/12(金) 10:26:37.15ID:1W1GlA05
匿名掲示板で誰が何を言ったのどうのとみっともないぞデフォルトの名無しさんよ
0727デフォルトの名無しさん
垢版 |
2021/02/12(金) 11:29:35.12ID:jxDcSv/l
どう見ても>>716がイミフな言いがかりつけてるだけにしか見えんが…

> 確かにideoneでもVS2019でも両方エラーになるのですだが、
> 1番目の例はVS2010ではビルドも通って動くもーん
0728デフォルトの名無しさん
垢版 |
2021/02/12(金) 13:22:44.45ID:x9NfpsA7
匿名でも江副とかQZとか片山やはちみつが糞なのは伝わってくるω
0730蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/12(金) 19:12:56.39ID:fTOQtm+W
どこでも動くように標準化しましょうねって話だよね。
0731蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/12(金) 19:29:19.43ID:WC9JZZt5
G++とかclang++などの複数のコンパイラで警告最大にして自動ビルドすれば再発防止できると思われます。
0732デフォルトの名無しさん
垢版 |
2021/02/12(金) 19:37:54.63ID:3abO7oQ0
流れをぶった切って質問です。

あるクラスで生成、削除を一切合切プライベートにしたい(ファクトリメソッドでスマートポインタを渡す)んだけど、
::deleteを対象クラスだけプライベート、あるいはコンパイルエラーにする
ことって可能かしらん?
0734蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/12(金) 19:55:37.68ID:fTOQtm+W
dtorはデストラクターの略ね。
死のトラクターじゃないよ。
0735デフォルトの名無しさん
垢版 |
2021/02/13(土) 02:57:21.77ID:ZCgeuP6g
映画化決定。
0736◆QZaw55cn4c
垢版 |
2021/02/15(月) 00:20:32.87ID:M7Hs01/T
>>728
私が馬鹿なのは私自身が認めていることですが、片山さんはすごいと思いますよ、何よりも片山さんは多産ですし、私は片山さんを尊敬しています‥‥
0737デフォルトの名無しさん
垢版 |
2021/02/15(月) 12:30:59.56ID:tZ1nblID
>>733
ありがとう。参考になりました。

流石にグローバルdtorの直接呼び出しを気にしている人は居なさそうですね。
通常の使い方じゃないから気にするな、が正解かしらん。
0739デフォルトの名無しさん
垢版 |
2021/02/16(火) 18:59:33.07ID:zTH+X1Xm
つかprivate dtorって何の解決にもなって
なくね?
クラスFooのデストラがprivateな時点で
Fooのfirendでも何でもないstd::shared_ptr<Foo>はビルドエラーになる宿命なのでは…
あとp.get()->Delete()とされるのも恐ろしいすぐる………
0747◆QZaw55cn4c
垢版 |
2021/02/17(水) 21:10:31.90ID:n4obO1jB
>>746
擬順序とか半順序と呼ぶ本もありますね、
ただ、その「比較可能性を満たす」とはなんでしょうか?私の教科書では、擬順序には反射律・推移律だけしか要請されていなかったと記憶しているのですが?
0748デフォルトの名無しさん
垢版 |
2021/02/17(水) 23:46:57.44ID:ZhVk2C4b
普通に言葉通り任意の2つの元を比較できるということなのでは…

木構造で「親は子より大きい」という順序を定義しただけ
(全順序集合(例えば整数)で全ノードをラベル付けしてしまうというチート手段に訴えことなく、
 文字通り「if (aはbの親) { a > b; }」という規則と(a, b)の反射律、推移律を導入しただけ
では兄弟間の大小が定まらない、
みたいな
0750デフォルトの名無しさん
垢版 |
2021/02/17(水) 23:59:39.55ID:ZhVk2C4b
なお{ 全順序集合 }⊂{ 半順序集合 }なのは確定的に明らかなので、
反射律・推移律だけしか要請されていなかったらそれは全順序集合の集合を含む半順序集合の集合の意味となりぬ
つまり全順序集合の集合と半順序集合の集合が区別できん
両社を区別したい議論のときは比較可能性の有無を宣明せねばならんぬ、
0751デフォルトの名無しさん
垢版 |
2021/02/18(木) 00:34:07.44ID:48a8FzyN
a≦b または b≦aが成り立つ時、比較可能
弱順序ってしらなかったけど、半順序とは違うようだ
「半順序?弱順序?二項関係・順序関係まとめ」って記事
0753741
垢版 |
2021/02/18(木) 06:50:20.77ID:brZHVFLx
>>742
まだ何とも言えないが
thx!
0754デフォルトの名無しさん
垢版 |
2021/02/18(木) 10:08:01.17ID:48a8FzyN
弱順序は、半順序よりは制限強いが全順序より弱いもので、
ある種のソートアルゴリズムでは全順序よりは制限緩められるけど
半順序までは緩められない、ってのがあるみたいね
0756デフォルトの名無しさん
垢版 |
2021/02/18(木) 14:43:05.98ID:48a8FzyN
アルゴリズムとの関連はちょっとわからんけど

数学としての束論って単独の本は少なくて、代数学の本に載ってるんじゃないかな
もしくは順序集合の話として集合論の本
0757◆QZaw55cn4c
垢版 |
2021/02/19(金) 04:42:11.06ID:3tFNJrqv
>>748
>普通に言葉通り任意の2つの元を比較できるということなのでは…

いや、それは全順序ですよ
・擬順序
・順序
これらの演算子を≦としたとき、かならずしも任意の二元 a, b について a ≦ b の真偽が定まらなくてもいいと思います

擬順序に対して「a ≦ b かつ b ≦ a ならば a = b」という縛りが追加されるのが順序、
順序に対して、任意の二元 a, b について「a ≦ b」または「b ≦ a」のどちらかである、という縛りが要請されるのが全順序
だったかと
0758デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:38:08.11ID:mpGE+xsF
wikipediaの「推移関係」の項目より

半順序 - 反対称的な擬順序
擬順序 - 推移的であると同時に反射的
全擬順序 - 完全的な擬順序
同値関係 - 対称的な擬順序
厳密弱順序 - 強半順序関係で等価関係での比較が不可能な場合
全順序 - 推移的で反対称的な完全関係

全順序、半順序くらいしか知らんかった
0759デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:51:11.65ID:gWMDVcMR
OOPの本だとサブクラス関係は前順序って書いてるよな?擬順序ともいうのか
推移的、A→B∧B→C |- A→C 、サブクラスのサブクラスはサブクラス
かつ反射的、AはAのサブクラス
0761◆QZaw55cn4c
垢版 |
2021/02/19(金) 21:23:56.68ID:3tFNJrqv
>>760
一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいいのですよ
すべての二項間で順序の真偽が定まるのは、順序の中でも一番強いものである全順序で初めて導入される、と私は解釈しています
0762デフォルトの名無しさん
垢版 |
2021/02/19(金) 21:44:53.04ID:gWMDVcMR
ブール代数 型システムで検索しても出てこないけど>>523
可補分配束の定義見てると確かにそんな気はしてくる

インスタンス関係かサブクラス関係なのか?どっちでも成り立ちそうだけど、取り敢えず静的チェックをパスすることを考える

要素が無いと言う意味でCのvoidを冪集合ブール代数の最小元、空集合とみなす
void *は何でも指せるという意味で最大元
まともな型システムなら(少なくとも)上記の擬順序以上は要求る
演算は多重継承とvirtual 定義が∨/∧に対応?クラス図書いてみたら成り立ちそうに思える
型チェック通らない全ての型を考えられるし、それが¬
型述語で定義してればそのまま!演算子になる
0763デフォルトの名無しさん
垢版 |
2021/02/19(金) 21:55:14.25ID:gWMDVcMR
確証が持てなくてもどかしい…数学できる人ツッコミ待ち

とりあえずダイヤモンド継承を許さない言語だと、常に∧/∨は定義されないからブール代数にはならない事には気付いた
0766デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:01:35.27ID:aORwmd7L
質問ですがムーブコンストラクタを有する基底クラスの
派生クラスでムーブコンストラクタを
派生クラスがムーブコンストラクトされる際に基底クラスにアクセスしようとする場合であっても
安全に書く方法って何かあるんでしたっけ
0767デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:03:03.40ID:6z9jMlRH
作ったクラスをmapにいれるときoperator<を書かなきゃいけないのがめんどい
0768デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:08:24.37ID:aORwmd7L
あとムーブコンストラクタを有するクラスを
詳細を隠ぺいする目的でインターフェースを設けたとき
インターフェース経由でムーブコンストラクトする方法って何かあるんでしたっけ
アブストラクトファクトリイーを作るしか無い?
0769デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:11:39.72ID:aORwmd7L
この場合アブストラクトファクトリイーといっても、元のクラスFooに対して
IFoo IFoo::move() { ... } が定義してあって
 IFoo x = (適当な生成手段)
ののち、
 IFoo y = x.move()
でxが破壊されるやつ!
0771デフォルトの名無しさん
垢版 |
2021/02/20(土) 00:40:16.16ID:iK8Sr3o/
領域が連続しているコンテナなら何でも良いんですが、たとえば array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
memcpy(b.data(), a.data(), n*sezeof(T))
で良いんですかね?

UNIXコマンドと順番が違ったりして間違えそうなのですが、他に良いやり方ありますか
0774デフォルトの名無しさん
垢版 |
2021/02/20(土) 08:11:48.90ID:BRyl48dG
>>761
その「一番弱い」とか言ってるのは前順序だろ。

ククク... 前順序は順序四天王の中でも最弱...
ウィキペディアにも書いてあるのに間違うとは面汚しよ...
0776◆QZaw55cn4c
垢版 |
2021/02/20(土) 11:27:39.73ID:mkFIMg3t
>>774
本によって用語にブレがあるのは数学では常識でしょう?だから>>761 では定義もあわせて書いておきました
0777デフォルトの名無しさん
垢版 |
2021/02/20(土) 11:30:33.89ID:ec7b4JGn
あとは裁判で争うしかないでしょうね。

我々には判決が出せませんから。
0778はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/20(土) 11:52:10.16ID:N5IkYQZo
>>771
前提条件として

・ T の型が trivially copyable である
・ vector の大きさが必要な大きさ分に出来ている

ならそれでもいいよ。
でも、 C の関数を C++ でも使えるのはほとんどが互換性のためでしかなく、
作法的にはあまり使わないに越したことは無いって感じ。
0779はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/20(土) 11:56:56.24ID:N5IkYQZo
>>771
>>778
と思ったけど、 vector<T> ではなくて vector< vector<T> > なのか。
それだと領域が連続するという前提が成り立たないんじゃないんですかね。
0780デフォルトの名無しさん
垢版 |
2021/02/20(土) 12:51:28.34ID:K0wy5MAI
>>770
どういう意味じゃ…
ムーブコンストラクトする手段をインターフェースとして公開したい需要は論理的に有り得る
それともIFoo::move()に実装が伴うからという意味?
0781デフォルトの名無しさん
垢版 |
2021/02/20(土) 14:23:36.69ID:XZPJJfWU
>>779
なぜ?
行優先か列優先かは置いといて、vectorの要素は連続するのだからvectorのvectorも連続するのでは?
サイズやキャパシティが変わったときに不連続になりうるということ?
0783デフォルトの名無しさん
垢版 |
2021/02/20(土) 14:57:30.99ID:upzAgg50
>>781
正しくコピーしたければ、
memcpy(b[0].data(), ...)
みたいにしないと。
このとき当然b[1]のデータ領域はb[0]の後ろに連続していない
0784はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/20(土) 15:27:01.55ID:N5IkYQZo
>>781
vector 型のオブジェクトが連続して並んでいることは保証されるよ。
でも vector 型のオブジェクトのメモリレイアウトがどうなってるかは保証されない。

常識的な実装は >>782 が言う通りヒープから持ってきたメモリのポインタなどを持ってるだけ。
データそのものを内包しているわけではない。
0785デフォルトの名無しさん
垢版 |
2021/02/20(土) 16:22:37.93ID:UDAFNKrx
ほらCと同じ基本の部分を教えずにいきなりSTLとか勧めるからこういう初心者が出てくる・・
0786デフォルトの名無しさん
垢版 |
2021/02/20(土) 17:06:29.35ID:1TZxH4Mg
ある程度出てきても問題ないだろ。ちゃんとドキュメント読んで理解してくれる人も多いんだろうし、
「Cと同じ基本の部分」を教えたところでちゃんと理解してくれない人も居るだろうし。
0790蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/20(土) 19:27:14.79ID:VmESNyRi
>>771

> array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
> memcpy(b.data(), a.data(), n*sezeof(T))
> で良いんですかね?

待てよ、b.data()って&b[0]だから型はvector<T>*だろ。書き換えたらいけないアドレスじゃん。

ダメです。
0791蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/20(土) 19:49:01.06ID:HfYkFRCd
C++のvectorでは、演算子[ ]がオーバーロードされてるから、C言語の常識が通用しないんだよ。

memcpyは危険な関数だから簡単にメモリー破壊できるんだよね。

std::vector v;
int a = 5;
memcpy(&v, &a, sizeof(a)); // vのメモリー破壊。
0793デフォルトの名無しさん
垢版 |
2021/02/20(土) 20:44:29.23ID:Rkd/h2tQ
別にここで何が正しいかを結論できなくてもいいのだが

>>776
そう言うなら「推移的かつ反射的であるのみの順序関係」が「弱順序」と書いてある本を
教えてくれる?
手元になかったらうろ覚えでもいいけど。〇〇の××先生がそう言ってたみたいのでもいいw
知識として一応確認しておきたいかなと。
0794◆QZaw55cn4c
垢版 |
2021/02/20(土) 21:19:47.30ID:mkFIMg3t
>>793

>>761 では「推移的かつ反射的であるのみの順序関係が『弱順序』」とはいっていませんよ、よく読んでくださいね
>>761 で言っているのは「一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいい」としかいっていませんですよね‥‥
曲解もはなはだしいと思いますね

ちなみに私の教科書ではこれを「擬順序」と定義しています、大熊正氏の本ですが、私には一生かかっても私には読めないでしょうから、あとはググってください
0796デフォルトの名無しさん
垢版 |
2021/02/20(土) 21:47:14.25ID:K0wy5MAI
つかこうかorz
std::vector<int> v((size_t)1);
const int a = 5;
memcpy_s(&(v[0]), sizeof(v[0]) * v.size(), &a, sizeof(a));
0797蟻人間 ◆T6xkBnTXz7B0
垢版 |
2021/02/20(土) 21:58:40.54ID:HfYkFRCd
この場合は素直にループを書くか、それとも格好良くstd::copy使うのが楽かな。
0800はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/02/21(日) 01:32:42.66ID:jd0qgVVy
それほど速くならない・速くなくていい場合のほうが圧倒的に多いってのもあるけどな。
0802770
垢版 |
2021/02/21(日) 03:54:49.57ID:HYHVDYIS
>>780
IFooっていう名前からしてインターフェースってJava/C#的な意味でのそれだと思ってたけど
それならポインタなり参照なりじゃないと機能してないよっていうかコンパイルエラーでしょってツッコミ
0803デフォルトの名無しさん
垢版 |
2021/02/21(日) 03:58:42.63ID:0HHdBuLy
メモリコピーを最適化する前に、他にすべきこと沢山あるだろ的な答えになるよな、確かに。
PG界の真理情報だわ。
0805デフォルトの名無しさん
垢版 |
2021/02/21(日) 07:43:27.01ID:F92hI73d
>>802
オブジェクトAがconstメンバとして保持しているブツの所有権を移してオブジェクトBを構築することは
ムーブコンストラクタでないと_なのでムーブコンストラクタである必要があり
この要請はオブジェクト全体が直接アクセスかポインタや参照経由の間接アクセスかとは独立愚連隊、

>>803
真に高速化を求められる内側のループでstd::vector<int> xとかしないから
>>796はひとつながりの省略のないコードとして読んだら判断を誤りうる
0806デフォルトの名無しさん
垢版 |
2021/02/21(日) 07:51:19.71ID:F92hI73d
じゃなかったorz
 Foo::Foo(const Foo& src) { (srcを変更して新しいインスタンスを初期化) }
はconst_cast<Foo>的な危険手段でないとやれないが
 Foo::Foo(Foo& src) { (srcを変更して新しいインスタンスを初期化) }
とするとなんかコンパイラが警告を出すから
 Foo::Foo(Foo&& src) { (srcを変更して新しいインスタンスを初期化) }
にせざるおえないという、
0808デフォルトの名無しさん
垢版 |
2021/02/21(日) 13:30:17.46ID:YxY+Ievf
こういう馬鹿にはちゃんとベンチマークとれって言ってやるのが正しい行い。
0810デフォルトの名無しさん
垢版 |
2021/02/21(日) 14:47:26.80ID:9WgNecVw
404 Not Found
0812デフォルトの名無しさん
垢版 |
2021/02/21(日) 16:21:41.69ID:u2qGdVDT
過疎ってるし、初心者どころかJavaの質問でもOKでは?
0813◆QZaw55cn4c
垢版 |
2021/02/21(日) 19:01:13.83ID:3Ebck9FU
>>807
この質問に対して回答をつける用意がありますが、しばしお待ちを
■ このスレッドは過去ログ倉庫に格納されています

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