C++が次の目的で無料の関数を採用した理由:
std::make_unique(...);
std::make_shared(...);
静的メンバー関数を使用する代わりに:
std::unique_ptr::make(...); // static
std::shared_ptr::make(...); // static
?
一貫性。
現在の構文の代わりに::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_shared
とmake_pair
が選択されたと思います。
前述の利点のために、make_pair
の代わりにpair::make
が選択されました。
慣例だけ以外に具体的な理由はありません。静的クラス関数は、グローバル関数が実行できるすべてのことを実行できます(機能的に)。
C++は、定義された名前空間内に含まれるグローバル関数(ユーティリティ関数用)を優先します。
他のプログラミング言語(Javaなど)は、グローバル関数がサポートされていないため、静的パブリック関数を好みます。
これはmake_***
にとって新しいものではなく、他の例が存在します。
std::this_thread::XXXX
の代わりにstd::thread::XXXX_current
現在の実行スレッドに関連する関数を静的関数としてthread
クラス内に配置することは理にかなっているかもしれませんが、それらはthis_thread
名前空間内でグローバルになります。
また、std::container::sort
のようなものをstd::container
がコンテナのヘルパークラスにすることもできますが、代わりにstd::sort
を使用します。