empty_view
类(C++ 标准库)
没有元素的视图。 此视图可用于测试目的(例如调用需要随视图提供的代码),但不需要访问其基础数据。
语法
template<class T>
requires std::is_object_v<T>
class empty_view : public ranges::view_interface<empty_view<T>>;
模板参数
T
元素的类型。 尽管其中 empty_view
没有元素,但所有范围都是同质的。 也就是说,它们具有某个特定类型的元素。 因此,即使 empty_view
没有元素,它仍然具有一个类型,例如 int
的 empty_view
,或者 strings
,等等。
视图特征
有关下列条目的说明,请参阅视图类特征
特征 | 说明 |
---|---|
范围适配器 | views::empty |
基础范围 | 无 |
元素类型 | 创建 empty_view 时指定 |
视图枚举器类别 | contiguous_range |
已设置大小 | 是的。 始终返回 0 |
是 const 可迭代 |
是 |
常见范围 | 是 |
借入范围 | 是 |
成员
成员函数 | 描述 |
---|---|
构造函数C++20 | 构造 empty_view 。 |
begin C++20 |
返回 nullptr 。 |
end C++20 |
返回 nullptr 。 |
size C++20 |
返回 0 |
从 view_interface 继承 |
描述 |
back C++20 |
导致未定义的行为。 |
data C++20 |
返回 nullptr 。 |
empty C++20 |
返回 true 。 |
front C++20 |
导致未定义的行为。 |
operator[] C++20 |
导致未定义的行为。 |
operator bool C++20 |
返回 false 。 |
注解
创建 empty_view
的最佳方法是使用 empty
范围适配器。 范围适配器是创建视图类的预期方法。 如果要创建自己的自定义视图类型,会公开视图类型。
由于 empty_view
中永远不能有任何元素,因此可以实施某些编译器优化。 例如,编译器将消除 for (auto e : std::views::empty<int>) {...}
,因为它知道无需循环访问。
empty_view
的另一个用途是使用 empty_view
分隔符拆分 split_view
,这会导致一系列单个元素范围。
要求
标头: <ranges>
(自C++20以来)
命名空间:std::ranges
编译器选项:/std:c++20
或更高版本是必需的。
构造函数
创建 empty_view
的实例。
template<class T>
inline constexpr empty_view<T> empty{};
参数
T
基础元素的类型,其中并没有该元素。
注解
创建 empty_view
的最佳方法是使用 empty
范围适配器。
示例 empty_view
// requires /std:c++20 or higher
#include <ranges>
#include <iostream>
int main()
{
auto anEmptyView = std::views::empty<int>;
bool isNotEmpty = (bool)anEmptyView;
std::cout << std::boolalpha << isNotEmpty << "\n"; // false
std::cout << std::boolalpha << anEmptyView.empty(); // true
}
false
true
back
导致未定义的行为。
constexpr auto back()
requires ranges::bidirectional_range<T> && ranges::common_range<T>;
constexpr auto back() const
requires ranges::bidirectional_range<const T> && ranges::common_range<const T>;
参数
无。
返回值
无。
注解
在调试生成中调用此函数将引发一个断言,该断言表明该函数已在空 view_interface
上调用。
begin
返回 nullptr
,因为视图中没有第一个元素。
static constexpr T* begin() noexcept
返回值
nullptr
data
返回 nullptr
,因为视图中没有用于获取指向其的指针的第一个元素。
static constexpr T* data() noexcept
返回值
nullptr
。
empty
测试派生视图是否为空。
static constexpr bool empty() noexcept
参数
无。
返回值
返回 true
。
end
返回 nullptr
,因为视图中没有任何元素。
static constexpr T* end() noexcept
返回值
nullptr
。
front
导致未定义的行为。
constexpr auto front()
requires ranges::forward_range<T>;
constexpr auto front() const
requires ranges::forward_range<const T>;
参数
无。
返回值
无。
注解
在调试生成中调用此函数将引发一个断言,该断言表明该函数已在空 view_interface
上调用。
operator[]
导致未定义的行为。
template<ranges::random_access_range R = T>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos);
template<ranges::random_access_range R = const T>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos) const;
参数
pos
要返回的元素相对于起始迭代器的位置。
返回值
无。
备注
在调试版本中调用此函数将引发一个断言,指示索引超出 view_interface
的范围。
operator bool
测试派生视图是否不为空。
constexpr explicit operator bool()
requires requires { ranges::empty(T ()); };
constexpr explicit operator bool() const
requires requires { ranges::empty(T ()); };
参数
无。
返回值
返回 false
。
示例 (bool)
// requires /std:c++20 or higher
#include <ranges>
#include <iostream>
int main()
{
auto anEmptyView = std::views::empty<int>;
if (anEmptyView) // check if anEmptyView isn't empty
{
std::cout << "Error: why does an empty_view have elements?\n";
}
else
{
std::cout << "Correct: an empty_view is not not empty\n";
}
}
Correct: an empty_view is not not empty
size
获取视图中的元素数,该数目将始终为 0。
static constexpr size_t size()
参数
无。
返回值
0
。