小编Fra*_*mes的帖子

为什么 C++20 范围概念指定了明显误导性的要求?

我正在努力满足我的班级的 C++20 概念。

struct C1
{
    int* begin();
    int* end();
};

static_assert(std::ranges::range<C1>);  // Compiles fine

struct C2 {};

namespace std::ranges    // (A)
{
    auto begin(C2&);
    auto end(C2&);
}

static_assert(std::ranges::range<C2>);  // Fails to compile
Run Code Online (Sandbox Code Playgroud)

std::ranges::range<>概念定义如下:

template <class _Rng>
concept range = requires(_Rng& __r) {
  std::ranges::begin(__r);
  std::ranges::end(__r);
};
Run Code Online (Sandbox Code Playgroud)

从字面意思上看,它指示我声明上面的函数 (A)。但这些都没有帮助。另一方面,像在类中一样定义两个成员函数C1 确实有效。我的问题是,我只是看不到概念所强加的要求与有助于 class 的解决方案之间的语义联系C1。它告诉我做一件事,而实际上我需要做另一件事。

请对此提供一些解释。

背景:在我的生产代码中,我的类确实定义了一个begin()end()函数,每个函数返回一个迭代器。但这个range概念并不满足这些定义,也未能告诉我原因。

请参阅编译器资源管理器上的完整示例

c++ c++-concepts c++20 std-ranges

0
推荐指数
1
解决办法
221
查看次数

标签 统计

c++ ×1

c++-concepts ×1

c++20 ×1

std-ranges ×1