Я хочу написати поняття "Індексируемое", яке означає, що послідовність або починається / закінчується, що повертає RandomAccessIterator, або оператор [], визначається і повертає значення недійсного типу.
Я використав ідеї зі статті 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");
Чомусь моя концепція ігнорує той факт, що оператор [] визначений приватним і повертає істинне. Що я пропускаю?
Це академічне завдання без будь-яких практичних застосувань.
—
magom001
Здається, не призначено: "Перевірка доступу проводиться як частина процесу заміни" eel.is/c++draft/temp#deduct-8.note-1
—
LF
Який компілятор ви використовуєте? Стовбур GCC , здається, відмінно працює godbolt.org/z/hY6UvY
—
sebrockm
static_assert
проходить для приватних operator[]
і не для громадськості.
concept bool
вказує на те, що ви компілюєте проти TS Концепції, а не C ++ 20 понять. Правила між ними можуть бути різними.
Indexable
концепцію на практиці? Оскільки він не гарантує єдиний інтерфейс, код, використовуючи його, все одно повинен статично відправляти інформацію про існуванняbegin(x)[i]
абоx[i]
.