私はちょうどstd::shared_ptr
の「エイリアシングコンストラクタ」を発見し、自分がなぜ::対応するものを持ってunique_ptrをはstdいない」尋ねる見つけました?なぜstd :: unique_ptrにstd :: shared_ptrのようなエイリアシングコンストラクタがないのですか?
あなたはFoo
あなたができるように割り当てたい場合、すなわちそうすることができるように素敵ではないでしょう、完全にFoo
の寿命を管理する必要がある関数にそのBar
メンバーを渡すか?これは、STDと連携
#include <memory>
struct B {}
struct A {
B b;
}
void f(std::unique_ptr<B> b);
std::unique_ptr<A> a = std::make_unique<A>();
std::unique_ptr<B> b { std::move(a), &(a->b) }; // a now invalid.
f(std::move(b)); // f now responsible for deleting the A.
を:: shared_ptrの(http://ideone.com/pDK1bc)
#include <iostream>
#include <memory>
#include <string>
struct B {
std::string s;
};
struct A {
B b;
A(std::string s) : b{s} {};
~A() { std::cout << "A deleted." << std::endl; }
};
void f(std::shared_ptr<B> b) {
std::cout << "in f, b->s = " << b->s << " (use_count=" << b.use_count() << ")" << std::endl;
}
int main() {
std::shared_ptr<A> a = std::make_shared<A>("hello");
std::shared_ptr<B> b { a, &(a->b) };
a.reset(); // a now invalid.
std::cout << "before f, b->s = " << b->s << " (use_count=" << b.use_count() << ")" << std::endl;
f(std::move(b)); // f now responsible for deleting the A.
std::cout << "after f" << std::endl;
return 0;
}
は期待
before f, b->s = hello (use_count=1)
in f, b->s = hello (use_count=1)
A deleted.
after f
はそのような事が含まれていなかった理由を論理的な理由がある出力しますか?そして/または、A
を削除するカスタムディターターを使用してunique_ptr<B>
でエミュレートするのは悪い考えですか?
そして、Deleterの型の部分以来、Deleterを消去しない限り、それは普通のunique_ptrとはうまく組み合わされません。それはさらに余分なオーバーヘッドです。 –
@ T.C:Deleterをタイプしても、それは 'unique_ptr>'とうまく相互作用しません。少なくとも、一方向のみの変換が可能です。 –
@ben理論上両方の方法で、失敗が許される限り。 – Yakk