std::ranges::view_interface<D>::empty
From 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) に束縛された参照であるとします。
D が sized_range を満たす場合は return ranges::size(derived) == 0; と同等です。それ以外の場合は、 return ranges::begin(derived) == ranges::end(derived); と同等です。 (1) と同じですが、derived が static_cast<const D&>(*this) である点が異なります。
目次 |
[edit] パラメータ
(なし)
[edit] 戻り値
派生型のオブジェクトのサイズが 0 である場合(D が std::ranges::sized_range を満たす場合)、またはその開始イテレータとセンチネルが等しい場合は true。それ以外の場合は false。
[edit] 注釈
以下の派生型は 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() メンバ関数を宣言していませんが、neither std::ranges::sized_range nor std::ranges::forward_range を満たさないため、デフォルト実装を使用できません。
[edit] 例
このコードを実行
#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()); }
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3715 | C++20 | empty() は forward_range 型のみをサポートしていました。 |
sized_range のみのような型もサポートされるようになりました。 |
[edit] 関連項目
| (C++17) |
コンテナが空かどうかをチェックする (function template) |
| (C++20) |
rangeが空かどうかをチェックする (カスタマイゼーションポイントオブジェクト) |