2016-01-28 13 views
10

使用libC++公開セクションにstd::shared_ptr::make_shared()静的メンバー関数があります。記事(1は、2)は信頼できるソースからの静的メンバ関数make_sharedについては何も言及していないので、私は標準準拠心配だ静的メンバー関数shared_ptrのmake_shared

using T = int; 
using P = std::shared_ptr<T>; 
auto p = P::make_shared(123); // <=> std::make_shared<T>(123) 
static_assert(std::is_same< decltype(p), P >::value); 

:私はすでにstd::shared_ptrの専門にタイプの別名定義されているときに非常に便利ですstd::shared_ptr

現在、この機能を使用するのは悪いですか?どうして?

+1

標準に十分な理由がないという事実はありませんか? –

+0

あなたはすでにこの機能が非標準であることを知っているようです。これは単なる意見に基づく質問ではありませんか? – Brian

+0

標準仕様をチェックしただけで、そこには記載されていません。これは実装固有のようです。 VS2015のC++標準ライブラリでは動作しません。 –

答えて

5

この静的make_sharedメンバ関数を使用する場合は、既に知っているように、g ++ /標準ライブラリの実装固有の拡張機能に依存します。あなたがそれから得る少しの利益のために、私はコードを携帯しておき、std::make_sharedを使用します。

既存のものからコピーまたは移動コンストラクタを使用して新しいオブジェクトを作成する場合は、代わりに(テストされていない; C++ 11互換の場合、後続の戻り型を追加する必要があります) :

template <typename T> 
auto share_ptr_to_new(T&& v) { 
    using T2 = typename std::remove_reference<T>::type; 
    return std::make_shared<T2>(std::forward<T>(v)); 
} 

上記の例では、auto p = share_ptr_to_new(123)と書くことができます。

+0

私にとって本当に近い選択肢は、ユーザ名空間のどこかにある 'std :: shared_ptr'自身の' make_shared'の[overloading](http://coliru.stacked-crooked.com/a/f87c5e9131d5eda7)です。 – Orient

3

FWIW、非メンバ関数として

template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); 

があります。

std::shared_ptr::make_sharedの代わりにstd::make_sharedを使用することができます。

+0

C++ 14の「」を扱うのは、私にとってはコピーブックの格言です。 – Orient

+0

@オリエント、私はそれを理解していませんでした。 –

+1

コピー本の最大のsynonims:本当の、共通の真実。 – Orient

関連する問題