- memory[meta header]
- std[meta namespace]
- unique_ptr[meta class]
- function[meta id-type]
- cpp11[meta cpp]
typename add_lvalue_reference<T>::type operator*() const; // (1) C++11
constexpr add_lvalue_reference_t<T> operator*() const; // (1) C++23- add_lvalue_reference[link /reference/type_traits/add_lvalue_reference.md]
- add_lvalue_reference_t[link /reference/type_traits/add_lvalue_reference.md]
ポインタを間接参照する。
- C++26 :
*declval<pointer>()が適格な式であること。- これにより、
unique_ptr<void>のように間接参照できない型に対してこの演算子はオーバーロード解決から除外され、SFINAEフレンドリに振る舞う(テンプレートやコンセプトの制約チェックでハードエラーにならず、単に制約を満たさないものとして扱われる)。
- これにより、
- C++26 :
Tが配列型である場合、またはadd_lvalue_reference_t<T>が有効な型でない場合、プログラムは不適格となる。
get() != nullptr- get()[link get.md]
#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
- GCC: 4.4.7 [mark verified]
- Clang: 3.0 [mark verified]
- Visual C++: 2010 [mark verified], 2012 [mark verified], 2013 [mark verified]
- P2273R3 Making
std::unique_ptrconstexpr - LWG Issue 4148.
unique_ptr::operator*should not allow dangling references- C++26で、
Tが配列型、またはadd_lvalue_reference_t<T>が有効な型でない場合にこの演算子の実体化が不適格となることが明確化された
- C++26で、
- 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*が利用できる)
- C++26で、