C++相談室 part120 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0060デフォルトの名無しさん
2015/10/25(日) 13:10:44.10ID:B2NleybVstruct NCNM { .../*コピー不可・ムーブ不可のクラス*/... };
NCNM f() { return NCNM(); }
int main() {
NCNM const & v = f();
}
君はこういう感じのコードが動くと思うか?
答えは動かない
returnの式の一時オブジェクトから返却値の一時オブジェクトの構築ができないから
throwの処理も裏では似たような感じで
try {
throw NCNM(); // (1)(2)
}
catch (NCNM const &) { // (3)
}
上記の場合なら
(1) ローカルな一時オブジェクトの構築(デフォルトコンストラクト)
(2) 例外オブジェクトという特殊な一時オブジェクトの構築
上記の形でムーブ可能なクラスの場合なら普通に(1)のローカルな一時オブジェクト
からムーブコンストラクトされる
(3) (2)で構築した例外オブジェクトが参照に拘束される
という流れになっている
ちなみに例外オブジェクトは名無しの一時オブジェクトだが
特別なのでlvalue扱いされてムーブはされない
■ このスレッドは過去ログ倉庫に格納されています