std::empty - cppreference.com
来自cppreference.com
| 在标头 |
||
| 在标头 |
||
| 在标头 |
(C++23 起) |
|
| 在标头 |
(C++23 起) |
|
| 在标头 |
||
| 在标头 |
(C++26 起) |
|
| 在标头 |
||
| 在标头 |
||
| 在标头 |
||
| 在标头 |
(C++26 起) |
|
| 在标头 |
||
| 在标头 |
||
| 在标头 |
(C++20 起) |
|
| 在标头 |
(C++23 起) |
|
| 在标头 |
||
| 在标头 |
||
| 在标头 |
||
| 在标头 |
||
| 在标头 |
||
| 在标头 |
||
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) 在底层 c.empty() 调用抛出时所抛出的异常
注解
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_nonmember_container_access |
201411L |
(C++17) | std::size()、 std::data() 和 std::empty()
|
__cpp_lib_initializer_list |
202511L |
(C++26) (DR11) |
std::initializer_list 的 data 与 empty 成员函数;移除 std::initializer_list 不需要的自由函数[1]
|
可能的实现
| 版本一 |
|---|
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 << "空\n"; else { std::cout << "元素:"; 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); }
输出:
元素: 1 2 3 空 元素: 4 5 6 元素: 7 8 9
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| P3016R6 | C++17 | 1) 对 std::initializer_list 提供了非成员 std::empty 重载2) 未要求 std::empty 传播异常说明
|
1) 已移除 2) 已要求 |