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


10

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를 반환한다는 사실을 무시합니다. 내가 무엇을 놓치고 있습니까?


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/hY6UvY (가) static_assert개인에 대한 전달 operator[]과 공공 실패합니다.
sebrockm

concept boolC ++ 20 개념이 아니라 Concepts TS에 대해 컴파일 중임을 나타냅니다. 둘 사이의 규칙이 다를 수 있습니다.
호두

답변:


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.