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 没有元素,它仍然具有一个类型,例如 intempty_view,或者 strings,等等。

视图特征

有关下列条目的说明,请参阅视图类特征

特征 说明
范围适配器 views::empty
基础范围
元素类型 创建 empty_view 时指定
视图枚举器类别 contiguous_range
已设置大小 是的。 始终返回 0
const 可迭代
常见范围
借入范围

成员

成员函数 描述
构造函数C++20 构造 empty_view
beginC++20 返回 nullptr
endC++20 返回 nullptr
sizeC++20 返回 0
view_interface 继承 描述
backC++20 导致未定义的行为。
dataC++20 返回 nullptr
emptyC++20 返回 true
frontC++20 导致未定义的行为。
operator[]C++20 导致未定义的行为。
operator boolC++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

另请参阅

<ranges>
empty 范围适配器
single_view
视图类