- 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のバグ?
|
|