[c++] 개념 TS 검사는 개인 액세스 수정자를 무시합니다.

RandomAccessIterator를 리턴하는 시퀀스가 ​​시작 / 종료되었거나 operator []가 정의되어 있고 void가 아닌 유형의 값을 리턴한다는 색인 가능한 개념을 작성하려고합니다.

Stroustrup의 기사 에서 Sequence 개념에 대한 아이디어를 사용 하여 다음과 같이 보강했습니다.

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 “제한된 결과의 액세스 제한 조건이 액세스 검사를 해제합니다” 이며 GCC10에서 수정 될 것입니다.


답변