Проверка концепции TS игнорирует модификатор частного доступа

10

Я хочу написать концепцию 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
источник
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[]и не для общественности.
Себрокм
concept boolуказывает на то, что вы компилируете против концептов TS, а не концепций C ++ 20. Правила между ними могут быть разными.
грецкий орех

Ответы: