前スレ
C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
探検
C++相談室 part161
レス数が900を超えています。1000を超えると表示できなくなるよ。
2022/05/21(土) 21:23:29.59ID:kYXfaM+5
804デフォルトの名無しさん
2022/09/29(木) 14:30:55.43ID:o/ss6osA >>803 何の前提も無ければ自分がソース持ってないところでオーバーライドされてる可能性もあるので、
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
805デフォルトの名無しさん
2022/09/29(木) 15:19:58.87ID:o1fQB+Qf806デフォルトの名無しさん
2022/09/29(木) 15:27:09.76ID:OAAH5wr1 ヘッダに実装が書かれててもエディタでショートカット1個押して折りたたむだけでインターフェースすぐわかるくね?
807デフォルトの名無しさん
2022/09/29(木) 17:04:17.17ID:nKyEXpsu まっとうならバイナリなりだけ開発環境でインポートすれば、
綺麗にインターフェイスが見える。
綺麗にインターフェイスが見える。
808はちみつ餃子 ◆8X2XSCHEME
2022/09/29(木) 17:12:42.79ID:xXycU9Ev 共有オブジェクト (ダイナミックリンクライブラリ) の段階にまでなってしまうと型は別のところから与える必要があって、
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
809803
2022/09/29(木) 17:14:04.54ID:o1fQB+Qf 今はLinuxでgcc+vimを使っています。
どういう環境なら見えますか?
どういう環境なら見えますか?
810デフォルトの名無しさん
2022/09/29(木) 18:21:37.90ID:YHMprl0j gtagsとか?
811はちみつ餃子 ◆8X2XSCHEME
2022/09/29(木) 21:13:35.71ID:xXycU9Ev >>809
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
812デフォルトの名無しさん
2022/09/29(木) 21:39:32.67ID:o1fQB+Qf813デフォルトの名無しさん
2022/09/29(木) 21:44:06.62ID:YHMprl0j 似てねーw
814デフォルトの名無しさん
2022/09/29(木) 21:59:47.36ID:xIdOGMqx ええ…
815デフォルトの名無しさん
2022/10/03(月) 10:37:30.67ID:BGisZcin816デフォルトの名無しさん
2022/10/03(月) 10:40:19.01ID:BGisZcin >>790
template ですね判ります
template ですね判ります
817デフォルトの名無しさん
2022/10/05(水) 11:46:44.33ID:qhw2L+Ej サイズが可変な自作クラスXのvectorを持ちたいとします。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
819デフォルトの名無しさん
2022/10/05(水) 12:31:37.02ID:Ghll8vG9 >>817
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?
820デフォルトの名無しさん
2022/10/05(水) 12:38:22.59ID:zqJzN+DI >>817
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません
もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません
もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
821デフォルトの名無しさん
2022/10/05(水) 12:52:15.30ID:qhw2L+Ej >>819
boost::multi_array の resize
boost::multi_array の resize
822デフォルトの名無しさん
2022/10/05(水) 12:53:20.63ID:qhw2L+Ej823はちみつ餃子 ◆8X2XSCHEME
2022/10/05(水) 13:05:31.97ID:q7thXXzU sizeof の結果は常に定数なんだよね……。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。
>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。
>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
824デフォルトの名無しさん
2022/10/06(木) 11:24:20.53ID:0pxze5TV やっぱり817が思ってる「おかしくなりますよね?」の最小コード提示してもらわないと
実はそれおかしくならないって結論になりそうなんだが?
実はそれおかしくならないって結論になりそうなんだが?
825デフォルトの名無しさん
2022/10/06(木) 14:37:24.06ID:BJfOFqw4 つまりおかしくなる理由が分からない人が相談に答えようとしているわけだな。
826デフォルトの名無しさん
2022/10/06(木) 15:08:29.15ID:cWE4RcCn827デフォルトの名無しさん
2022/10/06(木) 18:12:29.65ID:nyTo+ttU 「サイズ(sizeof)が可変なクラス」なんて存在しないから817が何かを勘違いしてるのは確かだが
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
828デフォルトの名無しさん
2022/10/06(木) 21:12:38.87ID:2ZLAwlmb829デフォルトの名無しさん
2022/10/07(金) 02:21:50.23ID:qb/V/k6I >827
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
830デフォルトの名無しさん
2022/10/07(金) 06:51:34.90ID:iCJcr8aJ 「サイズが可変な」はクラスに掛かってると考えるだろうふつう。vectorは当然サイズ可変なんだから
831デフォルトの名無しさん
2022/10/07(金) 07:35:25.67ID:BBv/2c76 sizeof(std::vector<T>)なんて気にせんだろふつー
832デフォルトの名無しさん
2022/10/07(金) 07:47:52.68ID:4lX0Ypwn まあクラスのサイズが変わるようなイメージだったよね
833デフォルトの名無しさん
2022/10/07(金) 08:23:09.11ID:0jEkBwds コード見せろ、この日本語が分からない奴に
このスレは無理
このスレは無理
834デフォルトの名無しさん
2022/10/07(金) 08:23:45.29ID:2UgM0KPC 質問者です
皆さんのおかげで解決しました
ありがとうございます
皆さんのおかげで解決しました
ありがとうございます
835デフォルトの名無しさん
2022/10/07(金) 08:24:03.77ID:2UgM0KPC もうこの話は終了でよろしくお願いします
836デフォルトの名無しさん
2022/10/07(金) 11:13:53.12ID:p6wqSRzL 817の類似
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
837デフォルトの名無しさん
2022/10/07(金) 11:34:57.30ID:fogpWmkA std::vectorもboost::multi_arrayも要素数の変更ができるけど、その可変可能個数要素を格納する領域はクラスのインスタンスとは別のヒープ領域に確保されるようになっていて、クラスのインスタンにはそのヒープ領域へのポインタが格納される
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
838デフォルトの名無しさん
2022/10/07(金) 11:35:56.48ID:fogpWmkA インスタンじゃなくてインスタンス…
839デフォルトの名無しさん
2022/10/07(金) 11:42:47.63ID:Y5jy7O5b >>837
なぜ上で書かれてるのと同じことを書きたくなったの?
なぜ上で書かれてるのと同じことを書きたくなったの?
840デフォルトの名無しさん
2022/10/07(金) 12:34:55.78ID:UqkGeV53841デフォルトの名無しさん
2022/10/07(金) 12:43:53.29ID:p6wqSRzL >>840
自分で質問しといてなんだけど、たいした問題点でもなかったりするんだよな…
vector<X*> list; だと要素をアクセスする際に記述が煩雑になるところ
list[i]->size(); ←おけ
list[i]->push_back(hoge); ←おけ
(*list[i])[j]; ←きもい
自分で質問しといてなんだけど、たいした問題点でもなかったりするんだよな…
vector<X*> list; だと要素をアクセスする際に記述が煩雑になるところ
list[i]->size(); ←おけ
list[i]->push_back(hoge); ←おけ
(*list[i])[j]; ←きもい
842デフォルトの名無しさん
2022/10/07(金) 12:54:10.56ID:p6wqSRzL 実体のポインタを list に詰まず new したものを詰んだ場合
お漏らしやタングリングポインタになるかもしれんってのもあるかな
これだと問題点が前提とは別のところになりそうではある
お漏らしやタングリングポインタになるかもしれんってのもあるかな
これだと問題点が前提とは別のところになりそうではある
843デフォルトの名無しさん
2022/10/07(金) 13:55:22.13ID:WQmSj+WJ >>841
ラッパー書きゃよろしいがな
template <typename T>
class Vector: private vector<T>
{
using Base_ = vector<T>;
public:
using Base_::push_back;
using Base_::size;
const typename remove_pointer <T>::type &operator [] (size_t i) const {return *Base_::operator[] (i);}
typename remove_pointer <T>::type &operator [] (size_t i) {return *Base_::operator[] (i);}
};
Vector<X*> list;
list[i]->size();
list[i]->push_back(hoge);
list[i][j];
ラッパー書きゃよろしいがな
template <typename T>
class Vector: private vector<T>
{
using Base_ = vector<T>;
public:
using Base_::push_back;
using Base_::size;
const typename remove_pointer <T>::type &operator [] (size_t i) const {return *Base_::operator[] (i);}
typename remove_pointer <T>::type &operator [] (size_t i) {return *Base_::operator[] (i);}
};
Vector<X*> list;
list[i]->size();
list[i]->push_back(hoge);
list[i][j];
844デフォルトの名無しさん
2022/10/07(金) 14:39:47.78ID:UqkGeV53845ハノン ◆QZaw55cn4c
2022/10/07(金) 19:06:21.61ID:E6DqXtFD >>827
http://www.kouno.jp/home/c_faq/c2.html#6
のことでしょ?
これはもう C89 の昔から言われ続けており、太古の C99 でも
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
のとおり導入されたわけですし
今更なんですけれどね
http://www.kouno.jp/home/c_faq/c2.html#6
のことでしょ?
これはもう C89 の昔から言われ続けており、太古の C99 でも
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
のとおり導入されたわけですし
今更なんですけれどね
846デフォルトの名無しさん
2022/10/07(金) 19:21:05.99ID:0j3FZIjL847デフォルトの名無しさん
2022/10/07(金) 19:57:27.07ID:T/Xux0J0848デフォルトの名無しさん
2022/10/07(金) 20:10:14.06ID:Znh4X5V+849デフォルトの名無しさん
2022/10/07(金) 21:32:58.03ID:WQmSj+WJ850デフォルトの名無しさん
2022/10/08(土) 01:45:23.92ID:wlHp0G63 >>841
思い出したけど boost::ptr_vector なるものもある
思い出したけど boost::ptr_vector なるものもある
851デフォルトの名無しさん
2022/10/08(土) 03:10:20.17ID:fnM9fLAu クラスメンバBの初期化が終わる前に、メンバAのコンストラクタにBのアドレスを渡すのって合法ですか?
852デフォルトの名無しさん
2022/10/08(土) 08:08:39.60ID:i+QsN2sY マルチアレーで思い出したけど、多次元配列クラスのSTL入ってどうなった?
boostとか自作クラスで対応せよってのは暴論だぜ
前者はパフォーマンス微妙だし管理されてない、後者はそれ言うなら何でもそうじゃん
boostとか自作クラスで対応せよってのは暴論だぜ
前者はパフォーマンス微妙だし管理されてない、後者はそれ言うなら何でもそうじゃん
853デフォルトの名無しさん
2022/10/08(土) 10:25:38.57ID:a+ry7eGB854デフォルトの名無しさん
2022/10/08(土) 13:47:19.43ID:wlHp0G63855デフォルトの名無しさん
2022/10/08(土) 14:59:34.51ID:0p5f7aQJ >>854
センスね~~~
センスね~~~
856デフォルトの名無しさん
2022/10/08(土) 15:04:31.64ID:wlHp0G63 >>855
ではセンスある解を!
ではセンスある解を!
857デフォルトの名無しさん
2022/10/08(土) 15:08:15.47ID:a+ry7eGB >>852
std::mdarrayのことなら揉めに揉めて伸びに伸びて今は一応C++26の予定
でもまだグチグチ揉めまくって収拾がつかなそうだからもう無理じゃないかな
代わりにstd::mdspanっていう配列に被せるガワが入りそう
std::mdarrayのことなら揉めに揉めて伸びに伸びて今は一応C++26の予定
でもまだグチグチ揉めまくって収拾がつかなそうだからもう無理じゃないかな
代わりにstd::mdspanっていう配列に被せるガワが入りそう
858デフォルトの名無しさん
2022/10/08(土) 15:56:11.12ID:Ys4Rhd8B 各次元の長さが可変で、全添字の走査が速くて、メモリの並びがFortran流かC流か選べるだけで良いのに何を揉める必要があるのか
859デフォルトの名無しさん
2022/10/08(土) 16:31:31.20ID:wlHp0G63 その程度なら自前で直ぐに作っちまいそうだが
標準に入ってることが意味あるんだろうな
標準に入ってることが意味あるんだろうな
860デフォルトの名無しさん
2022/10/08(土) 18:03:00.23ID:Ys4Rhd8B そりゃそうじゃね
「std::vectorよりも自作の配列クラスの方が優れてる」という主張が本当だったことがない
「std::vectorよりも自作の配列クラスの方が優れてる」という主張が本当だったことがない
862849
2022/10/08(土) 20:25:53.87ID:wHqQf0MD すいませんでしたw
863デフォルトの名無しさん
2022/10/08(土) 21:43:59.65ID:cYIJtZRn >>862
こちらこそ申し訳ございませんでしたw
こちらこそ申し訳ございませんでしたw
864デフォルトの名無しさん
2022/10/09(日) 00:52:23.28ID:KNQys/Sq SIMD まで自分ではやりたくないのでnumpyを呼ぶのほうが早い
865デフォルトの名無しさん
2022/10/09(日) 17:16:44.85ID:gpj8txwq >>864
じゃあ全部Pythonでよくねーか?
じゃあ全部Pythonでよくねーか?
866デフォルトの名無しさん
2022/10/09(日) 20:20:03.73ID:30oWykTj >>865
実際自分にとってはそんな感じですね。C++でpython とcudaとかopenmpを糊付けしている感覚があります
実際自分にとってはそんな感じですね。C++でpython とcudaとかopenmpを糊付けしている感覚があります
867デフォルトの名無しさん
2022/10/14(金) 14:32:13.11ID:hVSCfGeq set, mapというデータ構造があります。
mapはキーと値のペアをハッシュテーブルや2分探索木に格納しているのでしょうか?
mapはキーと値のペアをハッシュテーブルや2分探索木に格納しているのでしょうか?
868デフォルトの名無しさん
2022/10/14(金) 15:00:32.18ID:zHYXwlQW 平衡二分探索木です
ハッシュテーブル版はunordered_*です
ハッシュテーブル版はunordered_*です
869デフォルトの名無しさん
2022/10/14(金) 15:09:19.24ID:hyLjfQu2 ハッシュテーブルの方が大抵の場面で速いと思ってええんか?
870はちみつ餃子 ◆8X2XSCHEME
2022/10/14(金) 15:26:57.00ID:rgl2oNFZ871デフォルトの名無しさん
2022/10/14(金) 15:33:11.96ID:IS1pk00F872デフォルトの名無しさん
2022/10/14(金) 19:23:56.82ID:6Xf8KnhS >>871
ハッシュテーブルのサイズ、という地雷的制約は好まないのですけれどもね
ハッシュテーブルのサイズ、という地雷的制約は好まないのですけれどもね
873はちみつ餃子 ◆8X2XSCHEME
2022/10/15(土) 03:19:05.65ID:nP2nOTvD std::map::operator[] は O(long(N)) のオーダーなんだが、
std::unorderd_map::operator[] のオーダーは平均で O(1) 、最悪で O(N) ということになってんよね。
意図的に最悪を引き当てる、つまり攻撃に晒されるような状況では unorderd_map のほうが不利になる可能性もある。
std::unorderd_map::operator[] のオーダーは平均で O(1) 、最悪で O(N) ということになってんよね。
意図的に最悪を引き当てる、つまり攻撃に晒されるような状況では unorderd_map のほうが不利になる可能性もある。
874デフォルトの名無しさん
2022/10/15(土) 18:57:25.60ID:b3v/HVBd C++の例外処理は、class SomeClass {}; と中身の無いクラスであっても、
throw SomeClass{}; をcatch(SomeClass) {・・・}
で受け取ることが出来るらあしいけど、
どういう仕組みでcatchは、例外の種類を識別してる?
"SomeClass"のようなclass名の文字列のポインタでも一緒に渡している
のだろうか?
typeid(x)は、RTTI(実行時型情報)が必要で、仮想関数が定義されて無いクラス
に対しては上手く働かないのではなかったっけ?
throw SomeClass{}; をcatch(SomeClass) {・・・}
で受け取ることが出来るらあしいけど、
どういう仕組みでcatchは、例外の種類を識別してる?
"SomeClass"のようなclass名の文字列のポインタでも一緒に渡している
のだろうか?
typeid(x)は、RTTI(実行時型情報)が必要で、仮想関数が定義されて無いクラス
に対しては上手く働かないのではなかったっけ?
875デフォルトの名無しさん
2022/10/15(土) 21:57:03.29ID:QGPaA4bd まず基本を禿の本でも規格票でも読んで
C++例外処理ってそもそも何ってとこをわかってから
出直したら? そんな有様じゃマトモなレス付かないよ
C++例外処理ってそもそも何ってとこをわかってから
出直したら? そんな有様じゃマトモなレス付かないよ
876デフォルトの名無しさん
2022/10/15(土) 23:57:29.06ID:xWZqYwiR >>874 typeid と同等の情報で照合すれば可能ではあるんだから、何を不思議に思うことがあるのか。
「上手く働かないのでは」なんて言うぐらいならコード書いて確かめればいいだろうし。
「上手く働かないのでは」なんて言うぐらいならコード書いて確かめればいいだろうし。
877はちみつ餃子 ◆8X2XSCHEME
2022/10/16(日) 01:59:22.59ID:SvF0Fhwf >>874
例外を送出してスタックの巻き戻しをするのは例外を送出する側 (受け取る側ではなく) なんだよ。
つまり送出される例外オブジェクトの型はわかっている。
むしろどこまで巻き戻せばよいか (送出されるオブジェクトの型に対応する catch はどこにあるか) の情報が動的なものだ。
例外を送出してスタックの巻き戻しをするのは例外を送出する側 (受け取る側ではなく) なんだよ。
つまり送出される例外オブジェクトの型はわかっている。
むしろどこまで巻き戻せばよいか (送出されるオブジェクトの型に対応する catch はどこにあるか) の情報が動的なものだ。
878デフォルトの名無しさん
2022/10/16(日) 14:48:55.82ID:pwk0SnpM メンバ変数をまったく使っていないメンバ関数を見つける方法ってなんかある?
CppCheckとかでできるんだっけ
CppCheckとかでできるんだっけ
879デフォルトの名無しさん
2022/10/16(日) 15:16:25.24ID:r52/9r+u まあ普通の静的解析はチェックしてくれるのでは
880デフォルトの名無しさん
2022/10/16(日) 17:18:37.82ID:Y43orZLw881デフォルトの名無しさん
2022/10/16(日) 17:21:15.08ID:Y43orZLw typeid(x)の返すオブジェクトは完全にtype_info型なのか、
それとも、type_infoを継承したクラスなのか、どっち?
それとも、type_infoを継承したクラスなのか、どっち?
882はちみつ餃子 ◆8X2XSCHEME
2022/10/16(日) 22:40:17.52ID:SvF0Fhwf883デフォルトの名無しさん
2022/10/17(月) 05:46:15.36ID:SQKgR2D+ それこそtypeidに聞いてみりゃいい
cout << typeid(typeid(some_one)).name();
cout << typeid(typeid(some_one)).name();
884デフォルトの名無しさん
2022/10/17(月) 22:30:57.72ID:K/vFJtXQ T x;
T y;
に対して
x=move(y); //(1)
とした場合、時系列的に
1. move代入演算子 T::operator=(T &&a);がyの中身をxに入れる。但しこれは、2とも
関連しているがswap(x,y)とされることもある。
swap(x,y)を使わない場合には、xにyの中身を入れる前に元々の xの中身が削除される。
2. swapを使って無い場合には、続いてmove代入演算子 T::operator=(T &&a);が
y のポインタメンバなどに null 値を書き込む。
3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
4. デストラクタは、y ポインタメンバが null だと何も行なわない。
yの中身がxに交換されていた場合は、もともとxの中身だったものを削除する。
というような流れになるという理解で合ってる?
T y;
に対して
x=move(y); //(1)
とした場合、時系列的に
1. move代入演算子 T::operator=(T &&a);がyの中身をxに入れる。但しこれは、2とも
関連しているがswap(x,y)とされることもある。
swap(x,y)を使わない場合には、xにyの中身を入れる前に元々の xの中身が削除される。
2. swapを使って無い場合には、続いてmove代入演算子 T::operator=(T &&a);が
y のポインタメンバなどに null 値を書き込む。
3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
4. デストラクタは、y ポインタメンバが null だと何も行なわない。
yの中身がxに交換されていた場合は、もともとxの中身だったものを削除する。
というような流れになるという理解で合ってる?
885デフォルトの名無しさん
2022/10/17(月) 23:38:12.11ID:w3P18B12 実装依存では
886デフォルトの名無しさん
2022/10/17(月) 23:46:42.02ID:K/vFJtXQ >>885
特に確認したいのは、
>3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
の部分。
stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
らしいが、それは常に正しいのかな?
特に確認したいのは、
>3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
の部分。
stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
らしいが、それは常に正しいのかな?
887デフォルトの名無しさん
2022/10/18(火) 00:25:45.29ID:FMJmuyaZ >>886
> stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
> らしいが、それは常に正しいのかな?
そういう型を作ることはできるけど、そんな動作をしたらスコープアウトで走るデストラクタを
止めないといけなくなって非常に使いづらくなる。正しくなさそう。
あなたが何か読み間違えてるものと思われる。
> stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
> らしいが、それは常に正しいのかな?
そういう型を作ることはできるけど、そんな動作をしたらスコープアウトで走るデストラクタを
止めないといけなくなって非常に使いづらくなる。正しくなさそう。
あなたが何か読み間違えてるものと思われる。
888デフォルトの名無しさん
2022/10/18(火) 00:27:10.46ID:LFBcX+LO889デフォルトの名無しさん
2022/10/18(火) 03:36:36.81ID:UO6WFDjC xの元の中身も適切に破棄されますよっていう話を歪んだ理解してそう
890デフォルトの名無しさん
2022/10/18(火) 08:32:29.82ID:GEQmlbnE >>888
[訂正]
正しくは、
・move代入演算子 T::operator=(T &&a) 自体はデストラクタを呼び出さない。
・x=move(y) と書いたとき、コンパイラが 右辺の y に対してデストラクタを呼び出す。
2つのパターンが有る。パターン1:swapを使う。パターン2:swapを使わない。
いずれにせよ、コンパイラによって y.~T() が呼び出される。
擬似等価コード:
x.operator=(rvalue(y));
y.~T();
パターン1:
T &T::operator=(T &&a) {swap(*this,a); return *this:}
パターン2:
T &T::operator=(T &&a) {thisの中身を削除; aの中身をthisにコピー; aにnull値を書き込む; return *this;}
[訂正]
正しくは、
・move代入演算子 T::operator=(T &&a) 自体はデストラクタを呼び出さない。
・x=move(y) と書いたとき、コンパイラが 右辺の y に対してデストラクタを呼び出す。
2つのパターンが有る。パターン1:swapを使う。パターン2:swapを使わない。
いずれにせよ、コンパイラによって y.~T() が呼び出される。
擬似等価コード:
x.operator=(rvalue(y));
y.~T();
パターン1:
T &T::operator=(T &&a) {swap(*this,a); return *this:}
パターン2:
T &T::operator=(T &&a) {thisの中身を削除; aの中身をthisにコピー; aにnull値を書き込む; return *this;}
891デフォルトの名無しさん
2022/10/18(火) 08:42:53.23ID:FMJmuyaZ >>888 あなたの読み間違いではないと主張したいなら出典を挙げられるのがよいかと。
892はちみつ餃子 ◆8X2XSCHEME
2022/10/18(火) 12:16:32.80ID:PTXT62EI >>888
右辺と右辺値を混同しているとかじゃない? 右辺値と右辺値参照も違う概念。
右辺値 (というか prvalue) が完結式の終わりで解体されるのは保証された動作だけど、
std::move でキャストした結果はあくまでも参照を右辺値参照として返すってだけで
元のオブジェクト (この場合は y) は依然として左辺値だよ。
y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
右辺と右辺値を混同しているとかじゃない? 右辺値と右辺値参照も違う概念。
右辺値 (というか prvalue) が完結式の終わりで解体されるのは保証された動作だけど、
std::move でキャストした結果はあくまでも参照を右辺値参照として返すってだけで
元のオブジェクト (この場合は y) は依然として左辺値だよ。
y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
893デフォルトの名無しさん
2022/10/19(水) 01:49:23.30ID:ACk8fEyB >>892
>y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
なるほど。
でも結局、
T x;
T y;
x=move(y); //(1)
と書くと、(1) の部分で、
x.operator=(yを右辺値化したもの); //(2)
が行なわれて、
yの生存期間が終わる地点で、yのデストラクタであるところの y.~T() が呼び出される、
ということになることは間違いなのですね。
つまり、(2)が行なわれたら yはもはやmove後なのだから、yのデストラクタ呼び出しが
省略されるということではなく、yのデストラクタは絶対に必ず呼び出されるわけですね。
だから、T::operator=(T &&a) は、T::operator=(T &&a)の処理が終わった後に、
コンパイラによって yのデストラクタが呼び出されることを前提に処理しなければならない、
ということになる。
>y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
なるほど。
でも結局、
T x;
T y;
x=move(y); //(1)
と書くと、(1) の部分で、
x.operator=(yを右辺値化したもの); //(2)
が行なわれて、
yの生存期間が終わる地点で、yのデストラクタであるところの y.~T() が呼び出される、
ということになることは間違いなのですね。
つまり、(2)が行なわれたら yはもはやmove後なのだから、yのデストラクタ呼び出しが
省略されるということではなく、yのデストラクタは絶対に必ず呼び出されるわけですね。
だから、T::operator=(T &&a) は、T::operator=(T &&a)の処理が終わった後に、
コンパイラによって yのデストラクタが呼び出されることを前提に処理しなければならない、
ということになる。
894デフォルトの名無しさん
2022/10/19(水) 02:44:50.18ID:ACk8fEyB895はちみつ餃子 ◆8X2XSCHEME
2022/10/19(水) 04:13:29.85ID:CfflWiLk >>893
そう。 move assignment operator と呼ばれてはいるが
右辺値であるということがわかる以上の違いはない。
ムーブは寿命を左右せず、内容の状態がどうなるかは実装次第。
具体例で言えば std::unique_ptr はムーブ後には空になる (メンバ関数 get は空ポインタを返す) ことが保証されるが、
std::string は (新たな内容が与えられるまでは) 未規定の値になる。
右辺値参照が導入されたのは C++11 からで、
デストラクタのタイミングが変わってしまうような変更を入れられるわけがない。
そう。 move assignment operator と呼ばれてはいるが
右辺値であるということがわかる以上の違いはない。
ムーブは寿命を左右せず、内容の状態がどうなるかは実装次第。
具体例で言えば std::unique_ptr はムーブ後には空になる (メンバ関数 get は空ポインタを返す) ことが保証されるが、
std::string は (新たな内容が与えられるまでは) 未規定の値になる。
右辺値参照が導入されたのは C++11 からで、
デストラクタのタイミングが変わってしまうような変更を入れられるわけがない。
896デフォルトの名無しさん
2022/10/19(水) 23:39:12.93ID:8y/Qrf1S C++で15年ぶりにプログラミングをすることになったんだけど、
C++11以降のことは何も知らないのでまずは復習もかねて勉強することにした
今でもbjarneの本が初心者にとって一番のテキストなの?
それとももっとシンプルで分かりやすい本が出てるのでしょうか?
C++11以降のことは何も知らないのでまずは復習もかねて勉強することにした
今でもbjarneの本が初心者にとって一番のテキストなの?
それとももっとシンプルで分かりやすい本が出てるのでしょうか?
897デフォルトの名無しさん
2022/10/19(水) 23:45:19.38ID:w93eWlNE >>895
今考えてみれば、条件分岐の中だけでmove代入される場合も有るからかも知れませんね。
今考えてみれば、条件分岐の中だけでmove代入される場合も有るからかも知れませんね。
898デフォルトの名無しさん
2022/10/20(木) 03:01:20.64ID:3bh5ldea 昔のC++知ってるならとりあえずEffective Modern C++.でいいんじゃないの
899デフォルトの名無しさん
2022/10/20(木) 06:31:14.16ID:pIDfWPXL >>896
本は読者との相性があるから一概には言えないが
俺的にはやっぱ禿の本だな
変に手加減してこないところに安心感がある
ただし「プログラミング言語C++第4版」は
あくまでC++11で、C++14以後には触れていないので
構造化バインディングやコンセプトは学べない
俺はこのあたりはここやQiitaできっかけだけ拾って
あとは規格票やhttps://cpprefjp.github.io/で憶えてる
本は読者との相性があるから一概には言えないが
俺的にはやっぱ禿の本だな
変に手加減してこないところに安心感がある
ただし「プログラミング言語C++第4版」は
あくまでC++11で、C++14以後には触れていないので
構造化バインディングやコンセプトは学べない
俺はこのあたりはここやQiitaできっかけだけ拾って
あとは規格票やhttps://cpprefjp.github.io/で憶えてる
900はちみつ餃子 ◆8X2XSCHEME
2022/10/20(木) 13:52:31.60ID:w/WeLGfC901デフォルトの名無しさん
2022/10/20(木) 17:53:11.99ID:ieIEHaM0 ビャーネの本、章の構成がよく分からんのだけど何がどうしてああなったん
902デフォルトの名無しさん
2022/10/20(木) 18:26:02.35ID:zGrDbuOl 昔は、ロベールが鉄板だった
903デフォルトの名無しさん
2022/10/20(木) 18:47:34.03ID:sgmqUmRA bj氏の本のダブルディスパッチの部分と、次のVisitorの部分、
どっちもよく分からなかった。
まず、前者のShape&の引数が何のためにあって、どういう役割を果たしているか
誰か教えて。
どっちもよく分からなかった。
まず、前者のShape&の引数が何のためにあって、どういう役割を果たしているか
誰か教えて。
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 「アベノミクス」で投資対象と化したマンション ローンの低金利続き「年収の12倍」借りる20代出現 [蚤の市★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【実況】博衣こよりのえちえち朝こよ🧪 ★2
- 【!?】高市早苗「靖国神社電撃参拝プラン」浮上!これもう戦争だろ… [481941988]
- 【実況】博衣こよりのえちえち朝こよ🧪
- カカロット、腰痛い
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
