Я хочу написать концепцию Indexable, означающую, что последовательность либо имеет начало / конец, которые возвращают RandomAccessIterator, либо определен operator [] и возвращает значение не типа void.
Я использовал идеи из статьи Страуструпа для концепции 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
—
Себрокм
static_assert
проходит для частных operator[]
и не для общественности.
concept bool
указывает на то, что вы компилируете против концептов TS, а не концепций C ++ 20. Правила между ними могут быть разными.
Indexable
концепцию на практике? Поскольку он не гарантирует единого интерфейса, код, использующий его, все равно должен статически отправлять данные о существованииbegin(x)[i]
илиx[i]
.