コンセプトTSチェックはプライベートアクセス修飾子を無視します


10

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を返すという事実を無視します。何が欠けていますか?


1
興味をそそられて、実際にあなたのコンセプトをどのように使いますIndexableか 統一されたインターフェースを保証しないため、それを使用するコードは、begin(x)[i]またはの存在を静的にディスパッチする必要がありますx[i]
Konrad Rudolph

それは実用的なアプリケーションのない学術的な課題です。
magom001

1
意図していないようです:「アクセスチェックは置換プロセスの一部として行われます」eel.is/c++draft/temp#deduct-8.note-1
LF

どのコンパイラを使用していますか?GCCのトランクは、正常に動作するようですgodbolt.org/z/hY6UvYザ・はstatic_assertプライベート用に合格operator[]し、公共のために失敗しました。
sebrockm

concept boolC ++ 20の概念ではなく、Concepts TSに対してコンパイルしていることを示します。2つの間のルールは異なる場合があります。
クルミ

回答:


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.