最終更新日時: 2025年08月31日 19時06分36秒 (JST)
Raclamusi が更新

履歴 編集

customization point object
<ranges>

# std::ranges::empty(C++20)

    namespace std::ranges {
      inline namespace /*unspecified*/ {
        inline constexpr /*unspecified*/ empty = /*unspecified*/;
      }
    }

## 概要

Rangeが空かどうかを判定する関数オブジェクト。

## 効果

部分式`E`の型を`T`、`t`を`E`を評価した値とする。このとき、式`ranges::empty(E)`の効果は以下の通り。

1. `T`が要素数不明の配列型であれば、呼び出しは不適格。
2. `bool(t.empty())`が有効な式であれば、`bool(t.empty())`と等しい。
3. `ranges::size(t) == 0`が有効な式であれば、`(ranges::size(t) == 0)`と等しい。
4. `bool(ranges::begin(t) == ranges::end(t))`が有効な式で、`ranges::begin(t)`の型が`forward_iterator`のモデルであれば、`bool(ranges::begin(t) == ranges::end(t))`と等しい。

どれにも当てはまらないとき、呼び出しは不適格。

## 戻り値

Rangeが空のとき`true`、それ以外の時`false`。

## カスタマイゼーションポイント

`ranges::begin`と`ranges::end`、または`ranges::size`をカスタマイズすることで、`ranges::empty`をカスタマイズできる。 もしくは、メンバ関数`empty`を持たせるなどの方法でカスタマイズできる。

## 備考

`ranges::empty(E)`が有効な式であるとき、その型は`bool`である。

## 例

    #include <vector>
    #include <iostream>
    #include <ranges>

    int main()
    {
      int arr[4] = {};
      std::cout << std::boolalpha << std::ranges::empty(arr) << std::endl;

      std::cout << std::boolalpha << std::ranges::empty(u8"arikitari") << std::endl;

      std::vector<int> v;
      std::cout << std::boolalpha << std::ranges::empty(v) << std::endl;
      v.push_back(13);
      std::cout << std::boolalpha << std::ranges::empty(v) << std::endl;
    }

### 出力

    false
    false
    true
    false

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 関連項目

- `std::empty`

## 参照

- N4861 24 Ranges library
- C++20 ranges