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 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 E>
constexpr bool empty(initializer_list<E> il) noexcept; // (3) C++17
template <class E>
[[nodiscard]] constexpr bool empty(initializer_list<E> il) noexcept; // (3) C++20
}
概要
コンテナが空かどうかを判定する。
戻り値
- (1) :
return c.empty();
- (2) :
return false;
- (3) :
return il.size() == 0;
備考
- 機能テストマクロは
__cpp_lib_nonmember_container_access
で値は201411
<iterator>
ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
例
#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;
}
19
#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 ✅