Concept TS kontrolü özel erişim değiştiriciyi yok sayar


10

Bir dizini RandomAccessIterator döndüren başlangıç ​​/ bitiş ya da işleç [] tanımlanmış ve geçersiz türü olmayan bir değer döndürdüğü anlamına gelen dizinlenebilir bir kavram yazmak istiyorum.

Sıra kavramı için Stroustrup'un makalesindeki fikirleri kullandım ve aşağıdakilerle arttırdım:

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

Çoğu durumda çalışır, ancak aşağıdakilerde başarısız olur:

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

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

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

Bazı nedenlerden dolayı benim konseptim, [] operatörünün özel olarak tanımlandığı ve true değerini döndürdüğü gerçeğini yoksayar. Neyi kaçırıyorum?


1
İlgi dışında, nasıl olur kullanmak için Indexablepratikte kavramını? Tekdüze bir arabirimi garanti etmediği için, onu kullanan kodun ya begin(x)[i]da varlığından statik olarak gönderilmesi gerekir x[i].
Konrad Rudolph

Herhangi bir pratik uygulaması olmayan akademik bir ödevdir.
magom001


Hangi derleyiciyi kullanıyorsunuz? İş ince için GCC gövde görünüyor godbolt.org/z/hY6UvYstatic_assert özel için geçer operator[]ve kamu için başarısız oluyor.
sebrockm

concept boolC ++ 20 kavramlarına değil, Concepts TS'ye karşı derlediğinizi belirtir. İkisi arasındaki kurallar farklı olabilir.
ceviz

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.