トップページ > プログラム > 2015年10月25日 > 4lnR5/Hi

書き込み順位&時間帯一覧

13 位/167 ID中時間01234567891011121314151617181920212223Total
書き込み数0001100000001000000000003



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
C++相談室 part120 [転載禁止]©2ch.net

書き込みレス一覧

C++相談室 part120 [転載禁止]©2ch.net
55 :デフォルトの名無しさん[sage]:2015/10/25(日) 03:56:53.78 ID:4lnR5/Hi
try 〜 catchで、
・throwされる型のコピー/ムーブ コンストラクタ/代入演算子がアクセス不能な場合
・同じ型のreference, const referenceが同時にcatchされている場合
の挙動がよくわからん。
とりあえず
・コピーもムーブも可能な場合
(copy constructible, copy assignable, move constructible, move assignable)
同じ型のreference, const referenceが同時にcatchされていても上の方で
catchされる
→ まぁこれはわかる
・コピーができない場合(move constructible, move assignable)
値渡しのcatchがあるとコンパイルエラー
referenceのcatchとconst referenceのcatch両方あると上の方でcatchされる
catchされるときにムーブコンストラクタ/代入演算子は呼ばれていない
→ これもわかる
・コピーもムーブもできない場合
値渡しのcatchは当然コンパイルエラー
referenceのcatchとconst referenceのcatchもコンパイルエラーになる
→これがわからない。
 ムーブのみ可能なときにムーブコンストラクタ/代入演算子呼ばれてないのに
 なんでムーブ禁止するとコンパイルエラーになるねん。
C++標準でどう決まっているとか詳しい説明できる方いませんか。
なお上記実験で使ったコンパイラはclang。
C++相談室 part120 [転載禁止]©2ch.net
56 :デフォルトの名無しさん[sage]:2015/10/25(日) 04:04:12.94 ID:4lnR5/Hi
あ、あとポインタも… (検証忘れていた)
つまりcatchのパターンは以下の7種類…(多すぎ
・T
・T &
・const T&
・T *
・T *const
・const T *
・const T * const
ただこのうち
・T *とT *const
・const T *とconst T * const
は同等かな
ポインタは常にコピー可能なはずなので
なぜかrvalue referenceではcatchできない模様
C++相談室 part120 [転載禁止]©2ch.net
58 :デフォルトの名無しさん[sage]:2015/10/25(日) 12:50:41.08 ID:4lnR5/Hi
いろいろ試してわかったこと
・catchで同じ型の&やconst&が同時catchされていても、
 &やconst &としてthrowしたときに
 &やconst &でcatchされる訳ではない
 可能な限り上の方でcatchされる
 コピーが発生することもある
・throwされた型から暗黙的に変換可能な型のcatchがあっても、
 型が違うならcatchされない
 例えば、std::stringのcatchがあるときに
 throw "Hello, world!"とかやってもcatchされない
 std::stringでcatchするにはthrow std::string("Hello, world")
 とかしないといけない
・catchされるときに呼ばれるコピーコンストラクタで例外が飛ぶと
 catch不可能
 一番外側でcatch (...)してもcatchできなかった
 →これはまずくね? clangのバグ?


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。