Концепція перевірки TS ігнорує модифікатор приватного доступу


10

Я хочу написати поняття "Індексируемое", яке означає, що послідовність або починається / закінчується, що повертає 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");

Чомусь моя концепція ігнорує той факт, що оператор [] визначений приватним і повертає істинне. Що я пропускаю?


1
Як ви цікавитесь, як би ви використовували свою Indexableконцепцію на практиці? Оскільки він не гарантує єдиний інтерфейс, код, використовуючи його, все одно повинен статично відправляти інформацію про існування begin(x)[i]або x[i].
Конрад Рудольф

Це академічне завдання без будь-яких практичних застосувань.
magom001

1
Здається, не призначено: "Перевірка доступу проводиться як частина процесу заміни" eel.is/c++draft/temp#deduct-8.note-1
LF

Який компілятор ви використовуєте? Стовбур GCC , здається, відмінно працює godbolt.org/z/hY6UvYstatic_assert проходить для приватних operator[]і не для громадськості.
sebrockm

concept boolвказує на те, що ви компілюєте проти TS Концепції, а не C ++ 20 понять. Правила між ними можуть бути різними.
волоський горіх

Відповіді:


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.