std::ranges::view_interface<D>::empty
来自 cppreference.com
< cpp | ranges | view interface
constexpr bool empty() requires ranges::sized_range<D> || ranges::forward_range<D>; |
(1) | (自 C++20 起) |
constexpr bool empty() const requires ranges::sized_range<const D> || ranges::forward_range<const D>; |
(2) | (自 C++20 起) |
empty()
成员函数的默认实现检查派生类型对象的尺寸是否为 0(如果有效),或开始迭代器和哨兵是否比较相等。
1) 令 derived 为绑定到 static_cast<D&>(*this) 的引用。等效于 return ranges::size(derived) == 0; 如果
D
满足 sized_range
。否则,等效于 return ranges::begin(derived) == ranges::end(derived);.2) 与 (1) 相同,除了 derived 为 static_cast<const D&>(*this).
内容 |
[编辑] 参数
(无)
[编辑] 返回值
如果派生类型对象的尺寸为 0(如果 D
满足 std::ranges::sized_range),或其开始迭代器和哨兵比较相等,则为 true,否则为 false。
[编辑] 注释
以下派生类型可以使用 empty
的默认实现
- std::ranges::common_view
- std::ranges::drop_view
- std::ranges::drop_while_view
- std::ranges::elements_view
- std::ranges::filter_view
- std::ranges::join_view
- std::ranges::lazy_split_view
- std::ranges::reverse_view
- std::ranges::single_view
- std::ranges::split_view
- std::ranges::take_view
- std::ranges::take_while_view
- std::ranges::transform_view
尽管 std::ranges::basic_istream_view 继承自 std::ranges::view_interface 并且没有声明 empty()
成员函数,但它不能使用默认实现,因为它永远不会满足 std::ranges::sized_range 也不满足 std::ranges::forward_range。
[编辑] 示例
运行此代码
#include <array> #include <ranges> int main() { constexpr std::array a{0, 1, 2, 3, 4}; static_assert(!std::ranges::single_view(a).empty()); static_assert((a | std::views::take(0)).empty()); static_assert(!(a | std::views::take(5)).empty()); static_assert((a | std::views::drop(5)).empty()); static_assert(!(a | std::views::drop(3)).empty()); static_assert(std::views::iota(0,0).empty()); static_assert(!std::views::iota(0).empty()); }
[编辑] 缺陷报告
以下更改行为的缺陷报告已追溯应用到之前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3715 | C++20 | empty() 仅支持 forward_range 类型 |
sized_range 仅类型也受支持 |
[编辑] 另请参阅
(C++17) |
检查容器是否为空 (函数模板) |
(C++20) |
检查一个范围是否为空 (定制点对象) |