std::weak_ptr<T>::weak_ptr
提供: cppreference.com
<tbody>
</tbody>
constexpr weak_ptr() noexcept; |
(1) | (C++11以上) |
weak_ptr( const weak_ptr& r ) noexcept; |
(2) | (C++11以上) |
template< class Y > weak_ptr( const weak_ptr<Y>& r ) noexcept; |
(2) | (C++11以上) |
template< class Y > weak_ptr( const std::shared_ptr<Y>& r ) noexcept; |
(2) | (C++11以上) |
weak_ptr( weak_ptr&& r ) noexcept; |
(3) | (C++14以上) |
template< class Y > weak_ptr( weak_ptr<Y>&& r ) noexcept; |
(3) | (C++14以上) |
r とオブジェクトを共有するかもしれない、新しい weak_ptr を構築します。
1) デフォルトコンストラクタ。 空の
weak_ptr を構築します。2)
r によって管理されているオブジェクトを共有する新しい weak_ptr を構築します。 r がオブジェクトを管理していなければ、 *this もオブジェクトを管理しません。 テンプレート版のオーバーロードは、 Y* が T* に暗黙に変換可能である、または何らかの型 U および何らかの数値 N について Y が U の N 個の配列型であり、 T が U (またはその cv 修飾された型) のサイズ不明な配列型である (C++17以上)場合でなければ、オーバーロード解決に参加しません。3) ムーブコンストラクタ。 weak_ptr のインスタンスを
r から *this にムーブします。 この後、 r は空になり、 r.use_count()==0 になります。 テンプレート版のオーバーロードは、 Y* が T* に暗黙に変換可能でなければ、オーバーロード解決に参加しません。引数
| r | - | この std::weak_ptr によって表示される std::shared_ptr または std::weak_ptr。 |
ノート
デフォルトコンストラクタが constexpr であるため、 static な weak_ptr は、いかなる動的非ローカル初期化が始まるよりも前に、静的非ローカル初期化の一部として初期化されます。 このため、 static オブジェクトのコンストラクタで weak_ptr を使用しても安全です。
例
Run this code
#include <memory>
#include <iostream>
struct Foo {};
int main()
{
std::weak_ptr<Foo> w_ptr;
{
auto ptr = std::make_shared<Foo>();
w_ptr = ptr;
std::cout << "w_ptr.use_count() inside scope: " << w_ptr.use_count() << '\n';
}
std::cout << "w_ptr.use_count() out of scope: " << w_ptr.use_count() << '\n';
std::cout << "w_ptr.expired() out of scope: " << std::boolalpha << w_ptr.expired() << '\n';
}
出力:
w_ptr.use_count() inside scope: 1
w_ptr.use_count() out of scope: 0
w_ptr.expired() out of scope: true
関連項目
weak_ptr を代入します (パブリックメンバ関数) |