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

Does a range convert to bool via emtpy() member function when used as a if condition?

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

#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 的等价物也是如此。