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