web-dev-qa-db-ja.com

std :: unique_ptr :: makeの代わりにstd :: make_uniqueを使用する理由

C++が次の目的で無料の関数を採用した理由:

std::make_unique(...);
std::make_shared(...);

静的メンバー関数を使用する代わりに:

std::unique_ptr::make(...); // static
std::shared_ptr::make(...); // static

25
vladon

一貫性

現在の構文の代わりに::make構文を使用するやむを得ない理由はないと思います。 C +より前に存在していた既存のmake_uniqueおよびmake_shared関数との一貫性を保つために、静的な::make関数よりもstd::make_pairおよびstd::make_heapが優先されたと思います。 +11。


std::make_pairには大きな利点があることに注意してください。それは、関数呼び出しから結果のペアのタイプを自動的に推測します。

auto p0 = std::make_pair(1, 1.f); // pair<int, float>

std::pair::makeがある場合は、次のように記述する必要があります。

auto p1 = std::pair<int, float>::make(1, 1.f);

これはmake_pairの目的を無効にします。


  • したがって、開発者はすでにmake_uniqueや同様の機能に慣れているため、make_sharedmake_pairが選択されたと思います。

  • 前述の利点のために、make_pairの代わりにpair::makeが選択されました。

17
Vittorio Romeo

慣例だけ以外に具体的な理由はありません。静的クラス関数は、グローバル関数が実行できるすべてのことを実行できます(機能的に)。
C++は、定義された名前空間内に含まれるグローバル関数(ユーティリティ関数用)を優先します。
他のプログラミング言語(Javaなど)は、グローバル関数がサポートされていないため、静的パブリック関数を好みます。

これはmake_***にとって新しいものではなく、他の例が存在します。

std::this_thread::XXXXの代わりにstd::thread::XXXX_current
現在の実行スレッドに関連する関数を静的関数としてthreadクラス内に配置することは理にかなっているかもしれませんが、それらはthis_thread名前空間内でグローバルになります。

また、std::container::sortのようなものをstd::containerがコンテナのヘルパークラスにすることもできますが、代わりにstd::sortを使用します。

3
David Haim