我想写一个可索引的概念,意味着一个序列要么具有返回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的事实。我想念什么?
这是一项学术作业,没有任何实际应用。
—
magom001
似乎不是故意的:“访问检查是作为替换过程的一部分进行的” eel.is/c++draft/temp#deduct-8.note-1
—
LF
—
sebrockm
concept bool
表示您是根据Concepts TS而不是C ++ 20概念进行编译。两者之间的规则可能有所不同。
Indexable
在实践中使用您的概念?由于它不能保证统一的接口,因此使用它的代码仍然需要在begin(x)[i]
或存在时静态地分派x[i]
。