3

私はshared_ptrについて混乱しています。私の主な質問は次のとおりです。次のようにすると、C++は新しいオブジェクト(shared_ptrオブジェクト)を作成しますか?shared_ptr <T>とconst shared_ptr <const T>と

void Func1(const shared_ptr<T>& rhs) {} 
void Func2(const shared_ptr<const T>& rhs) {} 
shared_ptr<T> v1; 
Func1(v1); 
Func2(v1); 

明らかに、Func1(v1)は参照によって渡されます。しかし、についてはどうですか?Func2(v1)

コンパイラは、次のことを後ろにしますか?

shared_ptr<const T> tmp_v2 = v1; 
Func2(tmp_v2); 

(それが新しいのshared_ptrオブジェクトを作成しない場合)Func2Func1よりも多くの時間を要する可能性があるため、私は、それを気に。

ありがとうございました!

答えて

2

魔法の何かが、それだけでshared_ptr constructor overload (number 9)

template< class Y > 
shared_ptr(const shared_ptr<Y>& r); 

9の一つだ、ここではありませんが)rで管理対象オブジェクトの所有権を共有するshared_ptrを構築します。 rがオブジェクトを管理していない場合は、もオブジェクトを管理しません。 Yが暗黙的に(C++ 17まで)互換性がない(C++ 17以降)T *の場合、テンプレートのオーバーロードは過負荷解決に関与しません。そのためには

仕事に、const TTから暗黙的に変換しなければなら、別のオブジェクトは別のshared_ptrによって管理され、を作成されません。

+0

"_const Tは暗黙的にT_から変換可能でなければなりません"とはどういう意味ですか? – curiousguy

+0

@curiousguy彼は彼が言ったことを正確に意味すると思います。コンストラクタは 'Y'が' T'に暗黙的に変換可能であることを要求します。 OPの場合、「Y」は「T」であり、「T」は「const T」であるため、「Tは暗黙的にconst Tに変換可能」である必要があります。つまり、「const Tは暗黙的にTから変換可能。彼が言ったように。幸いにも、const Tは常にTから変換可能ですので、動作します。 –

関連する問題