std::weak_ptr<T>:: weak_ptr
From cppreference.net
C++
Memory management library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::weak_ptr
| Member functions | ||||
|
weak_ptr::weak_ptr
|
||||
| Modifiers | ||||
| Observers | ||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
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++11以降) |
|
template
<
class
Y
>
weak_ptr ( weak_ptr < Y > && r ) noexcept ; |
(3) | (C++11以降) |
weak_ptr
が、
r
とオブジェクトを共有する可能性のある新しい
weak_ptr
を構築します。
1)
デフォルトコンストラクタ。空の
weak_ptr
を構築します。
2)
r
が管理するオブジェクトを共有する新しい
weak_ptr
を構築する。
r
がオブジェクトを管理していない場合、
*
this
もオブジェクトを管理しない。テンプレート化されたオーバーロードは、
Y*
が
T*
に暗黙的に変換可能でない限り、オーバーロード解決に参加しない
(または
Y
が「
N
個の
U
の配列」型であり、
T
が「(CV修飾可能性のある)
U
の未知のサイズの配列」型である場合)
(C++17以降)
。
3)
ムーブコンストラクタ。
r
から
*
this
へweak_ptrインスタンスをムーブする。この後、
r
は空になり、
r.
use_count
(
)
==
0
となる。テンプレート化されたオーバーロードは、
Y*
が
T*
に暗黙的に変換可能でない限り、オーバーロード解決に参加しない。
目次 |
パラメータ
| r | - | この std::shared_ptr または std::weak_ptr によって参照される std::weak_ptr |
注記
デフォルトコンストラクタは
constexpr
であるため、静的
std::weak_ptr
は、
静的non-local初期化
の一部として、動的non-local初期化が開始される前に初期化されます。これにより、任意の静的オブジェクトのコンストラクタ内で
std::weak_ptr
を安全に使用できます。
例
このコードを実行
#include <iostream> #include <memory> 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
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2315 | C++11 |
move semantic was not enabled for
weak_ptr
|
enabled |
関連項目
weak_ptr
を代入
(公開メンバ関数) |