概念TS检查将忽略私有访问修饰符


10

我想写一个可索引的概念,意味着一个序列要么具有返回RandomAccessIterator的开始/结束,要么定义了operator []并返回非空类型的值。

我将Stroustrup的文章中的想法用于序列概念,并将其扩充为:

template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
    { t[n] } -> NotVoid;
};

它适用于大多数情况,但不适用于以下情况:

struct Bad {
    std::vector<int> nums;

private:
    int& operator[](size_t ind) {
        return nums[ind];
    }
};

static_assert(!Indexable<Bad>, "fail");

由于某种原因,我的概念忽略了operator []被定义为私有并返回true的事实。我想念什么?


1
出于兴趣,您如何Indexable在实践中使用您的概念?由于它不能保证统一的接口,因此使用它的代码仍然需要在begin(x)[i]或存在时静态地分派x[i]
Konrad Rudolph

这是一项学术作业,没有任何实际应用。
magom001

1
似乎不是故意的:“访问检查是作为替换过程的一部分进行的” eel.is/c++draft/temp#deduct-8.note-1
LF

您正在使用什么编译器?GCC主干似乎做工精细godbolt.org/z/hY6UvYstatic_assert通行证私人operator[]和失败公众。
sebrockm

concept bool表示您是根据Concepts TS而不是C ++ 20概念进行编译。两者之间的规则可能有所不同。
胡桃

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.