การตรวจสอบแนวคิด TS ไม่สนใจตัวแก้ไขการเข้าถึงส่วนตัว


10

ฉันต้องการเขียนแนวคิดที่สามารถจัดทำดัชนีความหมายว่าลำดับที่มีเริ่มต้น / สิ้นสุดที่ส่งกลับ RandomAccessIterator หรือผู้ประกอบการ [] ถูกกำหนดและส่งกลับค่าประเภทที่ไม่เป็นโมฆะ

ฉันใช้แนวคิดจากบทความของ Stroustrupสำหรับแนวคิด Sequence และเติมด้วย:

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");

ด้วยเหตุผลบางอย่างที่คอนเซ็ปต์ของฉันเพิกเฉยต่อความจริงที่ว่าตัวดำเนินการ [] ถูกกำหนดเป็นส่วนตัวและให้ผลตอบแทนจริง ฉันกำลังคิดถึงอะไร


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 boolบ่งชี้ว่าคุณกำลังคอมไพล์กับ Concepts TS ไม่ใช่แนวคิด C ++ 20 กฎระหว่างทั้งสองอาจแตกต่างกัน
วอลนัท

คำตอบ:


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.