2012-07-01 14 views
12
class MyClass { 
public: 
    MyClass(std::weak_ptr<MyClass> parent){} 
} 

をnullptrキャストすることはできません。なぜ私はこれをしたい><weak_ptrをする

のweak_ptr引数の

またはデフォルト値はnullです

auto newInstance = std::make_shared<MyClass>(nullptr); 
、など:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr); 

が、何が必要なのかは、代わりにこれを行うことです:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr)); 

なぜですか?

+0

あなたの質問にコンパイラのエラーが含まれています – akappa

答えて

23

概念上weak_ptrは別のweak_ptrまたはshared_ptrからのみ構築できるため、 nullptrであるかどうかにかかわらず、生のポインタから構築するのは意味がありません。

あなたはデフォルトを使用することができますが、あなたがnullptrを使用しようとしているweak_ptrstd::weak_ptr<MyClass>())の構築:

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>()); 
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>()); 
+1

'nullptr'には特別な型' nullptr_t'がありますので、生ポインタを暗黙的に 'nullptr_t'に変換することはできません。したがって、 'weak_ptr (nullptr)'を禁止する理由はありません。 – magras

+0

@magras私はこの答えを何年も前に書いていました。根本的に、weakポインタはshared_ptrに関連付けられているか、関連付けられていない必要があります。標準委員会は明らかにnullptrが関連していないこととデフォルトの構成を伝えていないと判断しました。 – David

-1

弱いポインタの主な目的は、他のコードによって破壊される可能性があるオブジェクトがまだ存在するかどうかを知ることが通常であります。普通のポインタから作成された弱いポインタは、オブジェクトがまだ存在するかどうかを知ることができますか?これがおそらく動作する方法を想像することはできますか?

+4

私はそれが想像できると思います。非常に簡単に。 :) – Kos

+0

"弱いポインタの唯一の目的は、他のコードによって破壊される可能性のあるオブジェクトがまだ存在するかどうかを知ることです"というのはちょっと混乱します。私はこれがweak_ptrの機能だと言うでしょう。スマートポインタの目的は、メモリ管理を自動化することです。さらに、weak_ptrにはいくつかの機能があります:(1)ライフタイムに影響を与えずにオブジェクトを観察すると言ったように(2)いわゆる "保持サイクル"を防ぐ(共有ポインタで互いに参照するオブジェクトの円があり、オブジェクトが生きてメモリリークを引き起こす)(3)shared_ptrを返す先のオブジェクトを参照することができます。 –

+1

weak_ptrをコンストラクタ内でnullptrに自動的に構築したいときはどうでしょうか?それは私がこの機能を必要とする時です。 – Andrew

関連する問題

 関連する問題