最終更新日時: 2026年01月31日 13時25分25秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<iterator>

# std::empty(C++17)

    namespace std {
      template <class C>
      constexpr auto
        empty(const C& c)
          -> decltype(c.empty());        // (1) C++17
      template <class C>
      [[nodiscard]] constexpr auto
        empty(const C& c)
          -> decltype(c.empty());        // (1) C++20
      template <class C>
      constexpr auto
        empty(const C& c)
          noexcept(noexcept(c.empty()))
          -> decltype(c.empty());        // (1) C++26

      template <class T, std::size_t N>
      constexpr bool
        empty(const T (&array)[N]) noexcept;   // (2) C++17
      template <class T, std::size_t N>
      [[nodiscard]] constexpr bool
        empty(const T (&array)[N]) noexcept;   // (2) C++20
      template <class T, std::size_t N>
      constexpr bool
        empty(const T (&array)[N]) noexcept;   // (2) C++26

      template <class E>
      constexpr bool
        empty(initializer_list<E> il) noexcept;   // (3) C++17、C++26で削除
      template <class E>
      [[nodiscard]] constexpr bool
        empty(initializer_list<E> il) noexcept;   // (3) C++20、C++26で削除
    }

(3)はC++26で削除された。`std::initializer_list`に、メンバ関数版の`empty()`が追加されたため、このオーバーフローは不要になった。使い方としてはこれまで通りに使用できる。

## 概要

コンテナが空かどうかを判定する。

- (3) : C++26で削除。汎用オーバーロード(1)を使用すること。

## 戻り値

- (1) : `return c.empty();`
- (2) : `return false;`
- (3) : `return il.size() == 0;` (C++26で削除)

## 備考

- 機能テストマクロは`__cpp_lib_nonmember_container_access`で値は`201411`
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる：
  - `<array>`
  - `<deque>`
  - `<forward_list>`
  - `<list>`
  - `<map>`
  - `<regex>`
  - `<set>`
  - `<string>`
  - `<string_view>` (C++20)
  - `<unordered_map>`
  - `<unordered_set>`
  - `<vector>`

## 例

    #include <vector>
    #include <iostream>

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

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

      std::vector<int> v;
      std::cout << std::boolalpha << std::empty(v) << std::endl;
      v.push_back(13);
      std::cout << std::boolalpha << std::empty(v) << std::endl;
      //変数vの型はstd名前空間にあるクラス型なので
      //ADLによって `std::`がなくとも発見できる
      std::cout << std::boolalpha << empty(v) << std::endl;
    }

### 出力

    false
    false
    true
    false
    false

## バージョン

### 言語

- C++17

### 処理系

- Clang: 3.6 ✅
- GCC: 6.1 ✅
- ICC: ??
- Visual C++: 2015 ✅

## 参照

- `boost::empty()` - Boost Range Library
- N4280: Non-member `empty()` and more (Revision 2)
- P0600R1: `[[nodiscard]]` in the library
  - C++20で`[[nodiscard]]`が付加された
- LWG Issue 3009. Including `<string_view>` doesn't provide `std::size/empty/data`
- P2422R1 Remove `nodiscard` annotations from the standard library specification
  - C++26で`[[nodiscard]]`指定が削除された
- P3016R6 Resolve inconsistencies in `begin`/`end` for `valarray` and `braced-initializer-list`