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

Concept TS check ignores private access modifier

本文关键字:访问 TS 检查 概念      更新时间:2023-10-16

我想写一个可索引的概念,这意味着序列的开始/结束都返回RandomAccessIterator,或者定义了运算符[]并返回非void类型的值。

我使用了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");

出于某种原因,我的概念忽略了运算符[]被定义为私有并返回true的事实。我错过了什么?

这是GCC错误#67225"具有约束结果的表达式约束关闭访问检查",将在GCC10中修复。