1. ホーム
  2. c++

[解決済み] なぜC++17でstd::make_uniqueを使うのか?

2022-10-19 21:41:24

疑問点

私の理解する限り、C++14 では std::make_unique を導入したのは、パラメータの評価順序が指定されていない結果、これが安全でなかったからです。

f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A

(説明: もし評価が最初に生のポインタのためのメモリを確保し、次に 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 のコンストラクタを超えるのですか?いくつかの例を与えることができますか?

今のところ、私が想像できる唯一の理由は、それがタイプすることを可能にすることです。 MyClass を一度だけタイプすることができるからです (たとえば std::unique_ptr<Base>(new Derived(param)) ). しかし、これはかなり弱い理由のように思えます。 std::make_unique がデレタを指定できないのに対して std::unique_ptr のコンストラクタでは可能です。

そして、はっきりさせておきたいのですが、私は std::make_unique を標準ライブラリから削除することに賛成しているわけではなく (少なくとも後方互換性のために残しておくことは意味があります)、むしろ std::unique_ptr

どのように解決するのですか?

主な理由が削除されたのは正しいです。まだ を使用しないでください。 のガイドラインがあることと、タイピングの理由が少なくなること(型を繰り返したり、単語を使う必要がないこと new ). 確かにそれらは強い主張ではありませんが、私は本当に new を見たくないのです。

また、一貫性も忘れてはいけません。あなたは絶対に make_shared を使うべきですから make_unique を使うのが自然で、パターンに合っています。それなら std::make_unique<MyClass>(param)std::make_shared<MyClass>(param) (またはその逆) のように、構文 A の方がはるかに多くの書き換えを必要とします。