Le contrôle Concept TS ignore le modificateur d'accès privé


10

Je veux écrire un concept indexable signifiant qu'une séquence a un début / fin qui renvoie RandomAccessIterator, ou operator [] est défini et renvoie une valeur de type non void.

J'ai utilisé des idées de l'article de Stroustrup pour le concept Sequence et je l'ai complété avec:

template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
    { t[n] } -> NotVoid;
};

Il fonctionne dans la plupart des cas mais échoue dans les cas suivants:

struct Bad {
    std::vector<int> nums;

private:
    int& operator[](size_t ind) {
        return nums[ind];
    }
};

static_assert(!Indexable<Bad>, "fail");

Pour une raison quelconque, mon concept ignore le fait que l'opérateur [] est défini comme privé et renvoie vrai. Qu'est-ce que je rate?


1
Par intérêt, comment utiliseriez- vous votre Indexableconcept dans la pratique? Puisqu'il ne garantit pas une interface uniforme, le code qui l'utilise devrait quand même statistiquement distribuer l'existence de begin(x)[i]ou x[i].
Konrad Rudolph

Il s'agit d'un travail académique sans aucune application pratique.
magom001

1
Semble pas prévu: "La vérification d'accès est effectuée dans le cadre du processus de substitution" eel.is/c++draft/temp#deduct-8.note-1
LF

Quel compilateur utilisez-vous? Le tronc GCC semble bien fonctionner godbolt.org/z/hY6UvY Les static_assertpasses pour le privé operator[]et échouent pour le public.
sebrockm

concept boolindique que vous compilez avec Concepts TS, et non avec les concepts C ++ 20. Les règles entre les deux pourraient être différentes.
noyer

Réponses:


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.