当用作 if 条件时,范围是否通过 emtpy() 成员函数转换为 bool?

问题描述

以下代码编译、运行并给出结果,就好像 range 正在通过 bool 转换为 range.empty()。真的是这样吗?我真的不太习惯导航 Range-v3 标头,所以我在这里问这个问题。

#include <iostream>
#include <range/v3/view/take.hpp>
#include <range/v3/view/drop.hpp>
#include <vector>

int main() {

    std::vector<int> v{1};
    if (auto range = v | ranges::views::take(1)) {
        std::cout << "take" << std::endl;
    }
    if (auto range = v | ranges::views::drop(1)) {
        std::cout << "drop" << std::endl;
    }
}

解决方法

类型符合 std::ranges::range 概念(或其 Range-v3 等效项)所需的唯一操作能够执行 std::ranges::begin/end在它(或它的 Range-v3 等价物)上。但这并不意味着范围类型只有这些操作。

符合概念的类型可以在此之上实现它想要的任何东西。因此,虽然 range 概念没有指定您所看到的功能,但它对于满足 range 提供它的任何特定类型都是有效的。

所以您真正要问的问题是这些特定的范围视图类型是否提供了这样的运算符。答案是yes,according to the documentation。如果基础范围是允许空测试的类型,则 view_interface 类型提供 explicit operator bool。就其价值而言,C++20 等价物也是如此。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...