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?
c++
c++-concepts
magom001
la source
la source
Indexable
concept dans la pratique? Puisqu'il ne garantit pas une interface uniforme, le code qui l'utilise devrait quand même statistiquement distribuer l'existence debegin(x)[i]
oux[i]
.static_assert
passes pour le privéoperator[]
et échouent pour le public.concept bool
indique que vous compilez avec Concepts TS, et non avec les concepts C ++ 20. Les règles entre les deux pourraient être différentes.Réponses:
Il s'agit du bogue GCC # 67225 «La contrainte d'expression avec un résultat contraint désactive la vérification d'accès» , qui sera corrigée dans GCC10.
la source