最終更新日時(UTC):
が更新

履歴 編集

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()が追加されたため、このオーバーフローは不要になった。使い方としてはこれまで通りに使用できる。

概要

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

戻り値

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

備考

#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

処理系

参照