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を返すという事実を無視します。何が欠けていますか?
それは実用的なアプリケーションのない学術的な課題です。
—
magom001
意図していないようです:「アクセスチェックは置換プロセスの一部として行われます」eel.is/c++draft/temp#deduct-8.note-1
—
LF
どのコンパイラを使用していますか?GCCのトランクは、正常に動作するようですgodbolt.org/z/hY6UvYザ・は
—
sebrockm
static_assert
プライベート用に合格operator[]
し、公共のために失敗しました。
concept bool
C ++ 20の概念ではなく、Concepts TSに対してコンパイルしていることを示します。2つの間のルールは異なる場合があります。
Indexable
か 統一されたインターフェースを保証しないため、それを使用するコードは、begin(x)[i]
またはの存在を静的にディスパッチする必要がありますx[i]
。