std::unique_ptr<T,Deleter>::operator*, std::unique_ptr<T,Deleter>::operator->
From cppreference.com
< cpp | memory | unique ptr
typename std::add_lvalue_reference<T>::type operator*() const noexcept(noexcept(*std::declval<pointer>())); |
(1) | (C++11以降) (C++23 以降 constexpr) |
pointer operator->() const noexcept; |
(2) | (C++11以降) (C++23 以降 constexpr) |
operator* および operator-> は、*this によって所有されているオブジェクトへのアクセスを提供します。
これらのメンバ関数は、単一のオブジェクト、つまりプライマリテンプレートに対する unique_ptr のみに提供されます。
|
1) もし std::reference_converts_from_temporary_v
<std::add_lvalue_reference_t<T>, decltype(*std::declval<pointer>())> が true ならば、プログラムは不正形式です。 |
(C++23から) |
もし get() がヌルポインタならば、動作は未定義です。
目次 |
[編集] 返り値
1) *this によって所有されているオブジェクトを返します。これは *get() に相当します。
2) *this によって所有されているオブジェクトへのポインタ、すなわち get() を返します。
[編集] 例外
1)
pointer が例外を投げる operator* を持つ場合、例外を投げる可能性があります。[編集] 注意
std::add_lvalue_reference の使用は、std::unique_ptr<void> をインスタンス化できるようにするためです。これは、C++ では void& は許可されていませんが、std::add_lvalue_reference<void> は void を生成するためです。詳細については、LWG673 を参照してください。
[編集] 例
このコードを実行
#include <iostream> #include <memory> struct Foo { void bar() { std::cout << "Foo::bar\n"; } }; void f(const Foo&) { std::cout << "f(const Foo&)\n"; } int main() { std::unique_ptr<Foo> ptr(new Foo); ptr->bar(); f(*ptr); }
出力
Foo::bar f(const Foo&)
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2762 | C++11 | operator* は、たとえ *get() が noexcept であっても、潜在的に例外を投げる可能性があります。 |
条件付き 例外仕様が追加されました。 |
| LWG 4148 | C++23 | operator* は、もしelement_type* が Deleter::pointer と異なる場合、ダングリング参照を返す可能性があります。 |
この場合、プログラムは 不正となる |
[編集] 関連項目
| 管理対象オブジェクトへのポインタを返す (public メンバ関数) |