我想写一个可索引的概念,这意味着一个序列要么具有返回 RandomAccessIterator 的开始/结束,要么定义了 operator[] 并返回一个非 void 类型的值。
我使用了来自 Stroustrup's article 的想法对于序列概念,并通过以下方式对其进行了扩充:
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[] 被定义为私有(private)并返回 true 的事实。我错过了什么?
最佳答案
这是 GCC 错误 #67225 "Expression constraint with a constrained result turns off access checking" ,这将在 GCC10 中修复。
关于c++ - 概念 TS 检查忽略私有(private)访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60392303/