あなたが参照する答えは実際には何か違うことに注意してください:
std::unique_ptr<T> ret (new T(std::forward<Args>(args)...));
このコード行では、明示的な動的割り当てが実行されます。ベストプラクティスでは、明示的な動的割り当てを実行するときはいつでも、結果を名前付きスマートポインターにすぐに割り当てる必要があります。詳細については、Boostshared_ptr
のベストプラクティスのドキュメントまたはHerbSutterのGotWの記事「例外安全な関数呼び出し」を参照してください。
式をより大きな式の部分式として持つことは必ずしも危険ではありませんnew
が、それは忘れがちなルールなので、常にベストプラクティスのガイドラインに従い、動的に割り当てられた新しいオブジェクトを名前付きスマートポインターに割り当てることをお勧めします。 。
とはいえ、名前付きオブジェクトを作成して返すというパターンには、少なくとも1つの利点があります。コードをすばやくステップ実行するときに、デバッガーでオブジェクトを「監視」する方が少し簡単です。
考えられる欠点の1つは、コンパイラが名前付きオブジェクトを使用して戻り値の最適化(RVO)を実行することがより困難になる可能性があることです。名前付き戻り値の最適化(NRVO)は、名前なしの一時的なRVOほど単純ではありません。最近のコンパイラにはどちらの方法でも問題がないと推測するのは危険ですが、私はC++コンパイラの最適化の専門家ではありません。