シーケンスがRandomAccessIteratorを返すbegin/endを持つか、operator []が定義されて非void型の値を返すことを意味するIndexableという概念を記述したいと思います。
私はシーケンスのコンセプトに Stroustrupの記事 のアイデアを使用し、次のように拡張しました。
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 []がプライベートとして定義され、trueを返すという事実を無視します。何が欠けていますか?
これはGCCのバグです #67225「制約された結果を伴う式の制約によりアクセスチェックがオフになります」 、これはGCC10で修正される予定です。