template<class T>
constexpr decay_t<T> decay-copy(T&& v)
noexcept(is_nothrow_convertible_v<T, decay_t<T>>); // (1) C++20
template<class T>
requires convertible_to<T, decay_t<T>>
constexpr decay_t<T> decay-copy(T&& v)
noexcept(is_nothrow_convertible_v<T, decay_t<T>>); // (1) C++23
概要
以下の型変換をしながら、値をコピーまたはムーブする。
- 左辺値から右辺値への変換
- 配列からポインタへの変換
- 関数の左辺値から関数ポインタへの変換
この関数は、参照ではなくコピーまたはムーブした値であることを明示するために使われる。
例えば、以下のような関数fがあるとき、式f()の効果を「gと等しい」と説明した場合、型はint&になってしまう。そこで、f()の効果を正確に述べるために「decay-copy(g)と等しい」という表現を用いる。
int g = 0;
int f(){ return g; }
効果
以下と等価である:
return std::forward<T>(v);
戻り値
式decay-copy(v)の値は次のようになる。
vが配列型の場合は、先頭要素へのポインタvが関数型の場合は、関数へのポインタvがrvalueの場合は、ムーブしたv- それ以外の場合、コピーした
v
バージョン
言語
- C++20
参照
- N4861 16.4.2.1 Exposition-only functions
- N3255 C++ Decay Copy 実際の関数として提案しているが、採用には至っていない。
- LWG Issue 3724. decay-copy should be constrained
- C++23で、
decay-copyにconvertible_to<T, decay_t<T>>制約が追加され、変換できない型に対してSFINAEフレンドリー(ill-formed)になった
- C++23で、