私が理解している限りでは、C ++ 14が導入さstd::make_unique
れたのは、パラメーターの評価順序が指定されなかった結果、これが安全ではなかったためです。
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(説明:評価が最初にrawポインターにメモリを割り当て、次に呼び出しをg()
行い、std::unique_ptr
構築前に例外がスローされた場合、メモリがリークします。)
呼び出しstd::make_unique
は呼び出し順序を制限する方法であり、これにより物事が安全になります。
f(std::make_unique<MyClass>(param), g()); // Syntax B
それ以来、C ++ 17があまりにも構文Aの安全を作り、評価順序を明らかにしたので、ここで私の質問です:まだ使用する理由であるstd::make_unique
以上std::unique_ptr
の++ 17 Cでコンストラクタを?いくつか例を挙げていただけますか?
今のところ、私が想像できる唯一の理由は、それがMyClass
一度だけタイプできることです(あなたがでポリモーフィズムに依存する必要がないと仮定するとstd::unique_ptr<Base>(new Derived(param))
)。しかし、それはかなり弱い理由のようです、特にstd::make_unique
がstd::unique_ptr
コンストラクターを使用している削除者を指定できないです。
そして明確にするために、私はstd::make_unique
標準ライブラリから削除することを支持することはしません(少なくとも後方互換性のためにそれを維持することは推奨しません)。std::unique_ptr
std::make_unique
、それをSTLに追加するのに十分な理由ではないと思います。特に、コンストラクターを使用するよりも表現力が弱い構文の場合はそうではありません
std::unique_ptr
ですか?それは反対の議論ではありませんmake_unique