最終更新日時:
が更新

履歴 編集

function
<memory>

std::unique_ptr::operator*(C++11)

typename add_lvalue_reference<T>::type operator*() const; // (1) C++11
constexpr add_lvalue_reference_t<T> operator*() const;    // (1) C++23

概要

ポインタを間接参照する。

テンプレートパラメータ制約

  • C++26 : *declval<pointer>()適格な式であること。
    • これにより、unique_ptr<void>のように間接参照できない型に対してこの演算子はオーバーロード解決から除外され、SFINAEフレンドリに振る舞う(テンプレートやコンセプトの制約チェックでハードエラーにならず、単に制約を満たさないものとして扱われる)。

要件

get() != nullptr

戻り値

*get()

#include <iostream>
#include <memory>

int main()
{
  std::unique_ptr<int> p(new int(3));

  int& r = *p;
  std::cout << r << std::endl;
}

出力

3

バージョン

言語

  • C++11

処理系

参照

  • P2273R3 Making std::unique_ptr constexpr
  • LWG Issue 4324. unique_ptr<void>::operator* is not SFINAE-friendly
    • C++26で、*declval<pointer>()適格であるという制約が追加され、unique_ptr<void>などに対してこの演算子がSFINAEフレンドリに振る舞うようになった。LWG 2762で追加された条件付きnoexceptにより、shared_ptr<void>::operator*とは異なり制約チェックの失敗ではなくハードエラーになりうる問題を解決するもの(GCC・Clangは執筆時点で未対応で、unique_ptr<void>に対してもoperator*が利用できる)