名前空間
変種
操作

std::unique_ptr<T,Deleter>::operator*, std::unique_ptr<T,Deleter>::operator->

From cppreference.com
< cpp‎ | memory‎ | unique ptr
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
 
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 メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)