Spec-Zone.ru › C++

std::empty

Определён в заголовочном файле <array>
Определён в заголовочном файле <deque>
Определён в заголовочном файле <flat_map> (начиная с C++23)
Определён в заголовочном файле <flat_set> (начиная с C++23)
Определён в заголовочном файле <forward_list>
Определён в заголовочном файле <hive> (начиная с C++26)
Определён в заголовочном файле <inplace_vector> (начиная с C++26)
Определён в заголовочном файле <iterator>
Определён в заголовочном файле <list>
Определён в заголовочном файле <map>
Определён в заголовочном файле <optional> (начиная с C++26)
Определён в заголовочном файле <regex>
Определён в заголовочном файле <set>
Определён в заголовочном файле <span> (начиная с C++20)
Определён в заголовочном файле <stacktrace> (начиная с C++23)
Определён в заголовочном файле <string>
Определён в заголовочном файле <string_view>
Определён в заголовочном файле <unordered_map>
Определён в заголовочном файле <unordered_set>
Определён в заголовочном файле <valarray>
Определён в заголовочном файле <vector>
template< class C >
constexpr auto empty( const C& c ) noexcept(noexcept(c.empty()))
    -> decltype(c.empty());
(1) (начиная с C++17)
template< class T, std::size_t N >
constexpr bool empty( const T (&array)[N] ) noexcept;
(2) (начиная с C++17)

Возвращает признак того, что заданный диапазон пуст.

1) Возвращает c.empty().
2) Возвращает false.

Параметры

c - контейнер или представление с функцией-членом empty
array - массив произвольного типа

Возвращаемое значение

1) c.empty()
2) false

Исключения

1) Те же исключения и при тех же условиях, что и при вызове underlying c.empty().

Примечания

Макрос проверки поддержки возможности Значение Стандарт Возможность
__cpp_lib_nonmember_container_access 201411L (C++17) std::size(), std::data() и std::empty()
__cpp_lib_initializer_list 202511L (C++26)
(DR11)
функции-члены data и empty класса std::initializer_list;
удаление ненужных свободных функций для std::initializer_list[1]
  1. По состоянию на 2026-05-27, libstdc++ не рассматривает добавление и удаление функций из P3016R6 как отчёт об ошибке для C++11 и применяет эти изменения только начиная с C++26.
    Перегрузка для std::initializer_list была необходима до P3016R6, поскольку у него не было функции-члена empty.

Возможная реализация

Первая версия
template<class C>
[[nodiscard]] constexpr auto empty(const C& c) noexcept(noexcept(c.empty()))
    -> decltype(c.empty())
{
    return c.empty();
}
Вторая версия
template<class T, std::size_t N>
[[nodiscard]] constexpr bool empty(const T (&array)[N]) noexcept
{
    return false;
}

Пример

#include <iostream>
#include <vector>

template<class T>
void print(const T& container)
{
    if (std::empty(container))
        std::cout << "Empty\n";
    else
    {
        std::cout << "Elements:";
        for (const auto& element : container)
            std::cout << ' ' << element;
        std::cout << '\n';
    }
}

int main()
{
    std::vector<int> c = {1, 2, 3};
    print(c);
    c.clear();
    print(c);
    
    int array[] = {4, 5, 6};
    print(array);
    
    auto il = {7, 8, 9};
    print(il);
}

Вывод:

Elements: 1 2 3
Empty
Elements: 4 5 6
Elements: 7 8 9

Отчёт об ошибке

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Корректное поведение
P3016R6 C++17 1) была предоставлена нешаблонная функция-член std::empty для std::initializer_list
2) от std::empty не требовалось распространять спецификацию исключений
1) удалена
2) требуется

См. также

ranges::empty
(C++20)
проверяет, пуст ли диапазон
(объект-точка настройки)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/empty

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API