最終更新日時: 2026年02月08日 18時00分28秒 (JST)
yoh が更新

履歴 編集

function
<exposition-only>

# decay-copy(C++20)

    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)`の値は次のようになる。

1. `v`が配列型の場合は、先頭要素へのポインタ
2. `v`が関数型の場合は、関数へのポインタ
3. `v`が`rvalue`の場合は、ムーブした`v`
4. それ以外の場合、コピーした`v`

## バージョン

### 言語

- C++20

## 参照

- N4861 16.4.2.1 Exposition-only functions
- N3255 C++ Decay Copy 実際の関数として提案しているが、採用には至っていない。