次のようなコードがあります。
ComplexObject cpy;
{
RAIILockObject _(obj->mutex);
cpy = obj->org;
}
// use cpy
議論のために、のデフォルトコンストラクタComplexObject
はコストがかかると仮定します。
- C ++コンパイラはcpyのデフォルトの構築/割り当てをコピーコンストラクタに置き換えることができますか(そしてできますか)?
- 両方のローカルオブジェクトのスコープを維持しながら、その最適化を強制するようにコードを再構築する方法はありますか?
編集:私は、RAIIオブジェクトを他のものと不適切にネストしたいという問題の一般的な解決策を本当に探しています。
コンラッド・ルドルフの解決策についてのコメントはありますか?
ComplexObject = LockedInitInPlace(obj->org, obj->mutex);
template<class C> C LockedInitInPlace(C& c, Mutex& m) {
RAIILockObject _(m);
return c;
}
編集2:
元のコードには次のシーケンスがあります。
- デフォルトの構成
cpy
- RAIIを構築する
lock
- 既存のオブジェクトをに割り当てる(コピーする)
cpy
- 破壊する
lock
- 使用する
cpy
- 破壊する
cpy
私が欲しいのは:
- RAIIを構築する
lock
- コンストラクト
cpy
(この場合、既存のオブジェクトを使用したコピーコンストラクターによる)。 - 破壊する
lock
- 使用する
cpy
- 破壊する
cpy