Namespaces
Variants

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

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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) このオブジェクトが所有するオブジェクトへのポインタを返します。すなわち 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 と異なる場合
この場合プログラムは
不適格

関連項目

管理対象オブジェクトへのポインタを返す
(公開メンバ関数)