私はEffective C++ 3rd Editionを読んでいました。 70ページで、著者は言う:unique_ptrからrawポインタへの暗黙的な変換はサポートされていますか?
Like virtually all smart pointer classes,
tr1::shared_ptr
andauto_ptr
also overload the pointer dereferencing operators (operator->
andoperator*
), and this allows implicit conversion to the underlying raw pointers (...)
彼はその後、Investment
という名前のクラスに基づいて、暗黙的な変換をフィーチャーし(一度にtr1
の一部であった)shared_ptr
に例を示します。まあ
shared_ptr<Investment> pi1();
bool taxable1 = !(pi1->isTaxFree());
^implicit conversion
shared_ptr<Investment> pi2();
bool taxable2 = !((*pi2).isTaxFree());
^implicit conversion
私はそれ以来、unique_ptr
でいくつかのテストケースを書いており、それらはホールドアップしています。
約unique_ptr
supporting arraysとshared_ptr
is also going to(注記を参照)も見つかりました。しかし、私のテストでは、暗黙的な変換は、配列の周りのスマートポインタのために動作していないようです。
例:私は
unique_ptr<int[]> test(new int[1]);
(*test)[0] = 5;
...これが有効になりたかったが、それは私のコンパイラ(のVisual C++ 2015のアップデート3)によると、ではありません。
次に、検索を行うと暗黙的な変換が全くサポートされていないという証拠が見つかりました。例えば、https://herbsutter.com/2012/06/21/reader-qa-why-dont-modern-smart-pointers-implicitly-convert-toのように。
この時点で私は疑いがあります。 (標準)がサポートされていますか?そうではありませんか?
注:著者はまた、「dinamicallyに割り当てられた配列のためauto_ptr
またはtr1::shared_ptr
のようなものは何もないでもTR1で、存在しない」という65ページの言うことから本は、このトピックに少し時代遅れかもしれません。
'*テスト[0] = 5;'あなたが欽慕'unique_ptr :: operator []'の結果です。もちろん、普通の 'int'では動作しません。 – StoryTeller
@StoryTeller公正で十分です。私はそれが固定されていたと思う... –
'unique_ptr'には 'operator *()'がありません。 'unique_ptr 'には 'operator []()'がありますが、 'unique_ptr 'には '演算子*()'があります。 'test [0] = 5;' –