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를 반환한다는 사실을 무시합니다. 내가 무엇을 놓치고 있습니까?
실제 응용 프로그램이없는 학업 과제입니다.
—
magom001
의도하지 않은 것 : "액세스 확인은 대체 프로세스의 일부로 수행됩니다" eel.is/c++draft/temp#deduct-8.note-1
—
LF
어떤 컴파일러를 사용하고 있습니까? 잘 작동에 GCC 트렁크 보인다 godbolt.org/z/hY6UvY (가)
—
sebrockm
static_assert
개인에 대한 전달 operator[]
과 공공 실패합니다.
concept bool
C ++ 20 개념이 아니라 Concepts TS에 대해 컴파일 중임을 나타냅니다. 둘 사이의 규칙이 다를 수 있습니다.
Indexable
실제로 개념을? 균일 한 인터페이스를 보장하지 않으므로 코드를 사용하는 코드는 여전히begin(x)[i]
또는 의 존재에 정적으로 디스패치해야합니다x[i]
.